2010-05-02 3 views
10

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

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

например.

function test() { 

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

} 

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

+0

Зачем это блокировать следующее утверждение? – zneak

+0

он выведет весь код из формы, например. класс, вставленный внутри функции –

+1

@jera: Это не то, что происходит. Я сказал это в своем ответе, но я подкреплю его здесь: есть ли ошибка/неисправность, с которой вы сталкиваетесь, что заставляет вас поверить в это? Если да, предоставьте нам более подробную информацию, чтобы мы могли исправить источник проблемы. – icio

ответ

17

Несколько удивительно, что это работает очень хорошо. Включенный код будет выполняться внутри области 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() любых возможных зависимостей в верхней части своего файла класса за пределами определения класса.

+0

Это может быть полезно, когда требуемый файл является переменным: 'require_once $ dirName. "/../{$ fileName} .php"; ' –

+0

Что делать, если файл также указывает пространство имен, правильно ли оно будет обрабатываться? Да, это сработало. – SiXoS

+0

@JamesPoulson Это также полезно для условной/отложенной загрузки кода. Например. плагин wordpress может иметь код, который используется только на интерфейсе/backend/ajax call/specific page и т. д. Поскольку плагины загружаются до того, как известно, какая страница/сообщение вы находитесь, вам нужно отложить загрузку, которая в wp выполняется с действиями, который будет называть да, функцией ... Это может ускорить работу сервера, но также избежать загрузки ненужных стилей и скриптов, уменьшающих ненужные запросы ... – nus

1

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

0

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

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

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

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

Post снова если вы» у вас возникли дополнительные вопросы по их работе после изучения их.

0

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

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

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

0

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

Смежные вопросы