из моего понимания, требуется код пасты в вызывающий php-файл.
что, если вам требуется внутри метода … он вставляет весь код / класс внутри метода, блокируя следующий оператор в методе.
например.
function test() { require 'pathtosomeclasscode'; somestatement; // any code after the require is blocked. }
как мне обойти это, чтобы иметь возможность требовать код где-нибудь, без его вставки в это точное место?
Несколько удивительно, что это работает очень хорошо. Включенный код будет выполняться внутри области 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 () любых возможных зависимостей в верхней части своего файла класса за пределами определения класса.
Требование вызова, require_once
, include
или include_once
не остановит выполнение кода внутри вашей функции, если не возникнет проблема с включенным скриптом . Код внутри включенного файла выполняется в той же области, что и функция (с определенными функциями и классами, являющимися глобальными), не вставленными в нее, заменяя то, что еще есть.
Другие ответы рекомендуют использовать одну из альтернатив, require
в качестве решения – эти решения могут работать для вас, если ошибка в ваших сценариях связана с конфликтом при именовании (т. Е. С попыткой переопределить класс или функцию), иначе вы можете хочу дать нам более подробную информацию о том, что произошло (или не произошло), чтобы вы подумали, что есть проблема, чтобы мы могли помочь вам решить настоящую причину.
В дальнейшем, эти методы включения файлов не вставляют код в ваш скрипт. Вставка – это инструмент, который люди используют для поддержания текста. Я предлагаю вам прочитать руководство по PHP, чтобы попытаться подробнее понять, как работают эти функции:
require
require_once
include
include_once
Отправьте сообщение, если у вас есть дополнительные вопросы по их работе после изучения их.
попробуйте require_once? Просто вы можете включить его в другое место.
Если вы используете 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(); } }
в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();
Я думаю, что вы говорите, что вы не хотите, чтобы код сразу исполнялся. Если это правильно, у вас есть несколько вариантов:
Вы можете переместить запрос.
Вы также можете прочитать файл с помощью функции fopen (), а затем проанализировать его. (Вы не можете вызвать eval, потому что он не поймет HTML, но вы можете сделать это с помощью синтаксического анализатора)
Как я вижу, вы используете внешние файлы для загрузки классов, я прав? Почему бы вам не использовать классы автозагрузки . Я знаю, что это не сработает, если вы захотите загрузить разные тела классов в разных обстоятельствах, но я действительно не знаю, хорошая ли это практика.