Php требует вызова класса изнутри метода

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

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

например.

  function test() {

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

 }

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

Ответ 1

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

Файл: Foo.php:

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

Файл: Baz.php:

<?PHP
class Baz{

      function bork(){
               require_once "Foo.php";
               $f = new Foo();
           $f->bar();
      }
}

echo "testing internal definition:\n";
$b = new Baz();
$b->bork();

echo "\ntesting in global scope:\n";

$f = new Foo();
$f->bar();
echo "\nall done\n";

Вывод:

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

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

all done

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

Ответ 2

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

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

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

Повторите попытку, если у вас появятся дополнительные вопросы по их работе после просмотра.

Ответ 3

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

Ответ 4

Если вы используете 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();
    }
}

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

$Whatever = new Whatever();
$Whatever->someFunction();
$Whatever->anotherFunction();

Ответ 5

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

  • Вы можете переместить запрос.

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

Ответ 6

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