PHP требует вызова класса изнутри метода - PullRequest
11 голосов
/ 03 мая 2010

Насколько я понимаю, требуется вставить код в вызывающий php-файл.

что, если бы вы требовали изнутри метода ... он вставил бы весь код / ​​класс в метод, блокируя следующий оператор в методе.

например.

  function test() {

    require 'pathtosomeclasscode';
    somestatement; // any code after the require is blocked.

 }

как мне обойти это, чтобы иметь возможность требовать код где угодно, без его вставки в это точное место?

Ответы [ 6 ]

19 голосов
/ 03 мая 2010

Удивительно, но это работает нормально. Включенный код будет выполняться внутри Baz :: bork (), но код просто определяет класс, а классы являются глобальными. Таким образом, вы получите определенный класс.

Файл: Foo.php:

<?PHP
class Foo{
      function bar(){
               echo "Hello from Foo::bar()!\n";
      }
}

Файл: Baz.php:

* +1007 *

Выход:

$ php Baz.php
testing internal definition:
Hello from Foo::bar()!

testing in global scope:
Hello from Foo::bar()!

all done

Теперь я не могу вспомнить, во многих местах, где вы хотели бы делать вещи таким образом. Люди обычно требуют от __cece () любых возможных зависимостей в верхней части своего файла класса, вне определения класса.

7 голосов
/ 03 мая 2010

Вызов require, require_once, include или include_once не остановит выполнение кода в вашей функции , если не будет проблемы с включенным скриптом, Код во включенном файле выполняется в той же области действия , что и функция (с определенными функциями и классами, являющимися глобальными), не вставляется в нее, заменяя то, что еще есть.

В других ответах рекомендуется использовать одну из альтернатив require в качестве решения - эти решения могут работать для вас, если ошибка в ваших сценариях связана с конфликтом в именовании (т. Е. Попытка переопределить класс или функцию ), в противном случае вы можете сообщить нам более подробную информацию о том, что произошло (или не произошло), чтобы заставить вас думать, что есть проблема, и мы можем помочь вам решить реальную причину.

Кроме того, эти методы включения файлов не вставляют код в ваш скрипт. Вставка - это инструмент, который люди используют для сохранения текста. Я предлагаю вам прочитать руководство по PHP, чтобы попытаться понять, как работают эти функции:

Опубликуйте еще раз, если у вас есть дополнительные вопросы по поводу их работы после изучения.

1 голос
/ 03 мая 2010

Если вы используете include_once ('script.php'), вы не столкнетесь с ошибками при повторном объявлении классов.

Я сам не пробовал следующее, но я думаю, что эта настройка также может работать, если вы не хотите включать избыточно include_once ():

class Whatever {

    protected $classObject;
    public function __construct( /*...*/ ) {
        include('anotherClass.php');
        $this->classObject = new anotherClass();
    }

    public function someFunction( /*...*/ ) {
        $this->classObject->classObjectFunction();
    }

    public function anotherFunction( /*...*/ ) {
        $this->classObject->classObjectFunction();
    }
}

Затем можно вызвать следующий код, каждый из которых будет вызывать функцию в одном и том же объекте общего класса:

* +1007 *
1 голос
/ 03 мая 2010

попробовать require_once? Просто включите его в другое место.

0 голосов
/ 04 мая 2010

Как я вижу, вы используете внешние файлы для загрузки классов, я прав? Почему бы вам не использовать автозагрузку классов . Я знаю, что это не сработает, если вы хотите загружать тела разных классов в разных обстоятельствах, но я действительно не знаю, хорошая ли это практика.

0 голосов
/ 03 мая 2010

Я думаю, что вы говорите, что вы не хотите, чтобы код выполнялся сразу. Если это правильно, у вас есть несколько вариантов:

  1. Вы можете переместить требование.

  2. Вы также можете прочитать файл с помощью fopen (), а затем проанализировать его. (Вы не можете вызвать eval, потому что он не понимает HTML, но вы можете сделать это с помощью анализатора)

...