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

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

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

eg.

  function test() {

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

 }

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


person Jeremy Gwa    schedule 02.05.2010    source источник
comment
Почему он блокирует следующий оператор?   -  person zneak    schedule 03.05.2010
comment
это выведет весь код из формы, например. класс вставляется внутрь функции   -  person Jeremy Gwa    schedule 03.05.2010
comment
@jera: Это не то, что происходит. Я сказал это в своем ответе, но я подчеркну это здесь: есть ли ошибка / неисправность, с которой вы столкнулись, которая заставляет вас поверить, что это так? Если это так, предоставьте нам более подробную информацию, чтобы мы могли устранить источник проблемы.   -  person icio    schedule 03.05.2010
comment
icio правильно. Это отлично работает (см. мой пример кода ниже). Если вы используете require_once, а ваш подключаемый файл просто определяет класс, то вы, по сути, лениво загружаете определение класса, хотя и несколько запутанным образом.   -  person timdev    schedule 03.05.2010
comment
Я боролся с связанной проблемой, но неправильно искал в Google, поэтому вот ссылка на решение для тех, у кого может быть такая же ошибка: stackoverflow.com/questions/12242964/   -  person Emanuel Graf    schedule 12.10.2020
comment
Вложенные классы не допускаются, верно?   -  person s3c    schedule 20.01.2021


Ответы (6)


Несколько удивительно, что это работает просто отлично. Включенный код будет выполняться внутри области действия 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

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

person timdev    schedule 03.05.2010
comment
Это может быть полезно, когда требуемый файл является переменным: require_once $dirName . "/../{$fileName}.php"; - person James P.; 15.08.2013
comment
Что, если в файле также указано пространство имен, будет ли он обрабатывать это правильно? Да, это сработало. - person SiXoS; 23.03.2014
comment
@JamesPoulson Это также полезно для условной/отложенной загрузки кода. Например. плагин wordpress может иметь код, который используется только во внешнем интерфейсе/бэкенде/вызове ajax/конкретной странице и т. д. Поскольку плагины загружаются до того, как станет известно, на какой странице/сообщении вы находитесь, вам необходимо отложить загрузку, которая в wp выполняется с помощью действий, который вызовет да, функцию... Это может ускорить работу на стороне сервера, а также избежать загрузки ненужных стилей и скриптов, уменьшая ненужные запросы... - person ; 17.12.2014

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

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

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

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

person icio    schedule 03.05.2010

попробовать require_once? Просто добавьте его в другое место.

person Titan    schedule 02.05.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();
    }
}

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

$Whatever = new Whatever();
$Whatever->someFunction();
$Whatever->anotherFunction();
person buley    schedule 03.05.2010

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

  1. Вы можете переместить файл require.

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

person waiwai933    schedule 03.05.2010

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

person Community    schedule 04.05.2010