PHP spl_autoload

я действительно не получаю документы для spl_autoload

bool spl_autoload_register  ([ callback $autoload_function  ] )

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

public function autoload() {
    require ('nonLoadedClass.php');
}
spl_autoload_register(autoload);
$x = new nonLoadedClass();

заставит требование работать? таким образом, я могу также зарегистрировать много функций автозагрузки?

public function autoloadXXX() {...}
public function autoloadYYY() {...}
public function autoloadZZZ() {...}
spl_autoload_register('autoloadXXX');
spl_autoload_register('autoloadYYY');
spl_autoload_register('autoloadZZZ');

в случае доктрины,

require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));

массив передается, таким образом, я предполагаю, что он попытается выполнить функцию автозагрузки в классе Доктрины (который требовался)?

6
задан iceangel89 14 December 2009 в 05:26
поделиться

3 ответа

spl_autoloader_register регистрирует функцию / метод обратного вызова, который будет вызываться, когда ваш код пытается использовать неизвестный класс.

Функция обратного вызова можно описать несколькими способами:

  • простое имя функции: 'my_function'
  • статический метод класса: массив ('MyClass', 'myMethod')
  • метод экземпляр класса: array ($ myObject, 'myMethod')

В случае Doctrine это кажется вторым решением: если используется класс, о котором PHP не знает, автозагрузчик вызовите Doctrine :: autoload , передав ему имя класса в качестве параметра.


так что я могу также зарегистрировать много автозагрузок функции?

Да, можно, с помощью spl_autoload_register :

Если должно быть несколько автозагрузок функции, spl_autoload_register () позволяет это. Это эффективно создает очередь функций автозагрузки, и проходит через каждую из них в порядок их определения.

Но мы обычно не определяем одну функцию / метод автозагрузки для каждого имеющегося у нас класса; я полагаю, это было бы довольно неэффективно.

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

Например, функция автозагрузки может выглядеть так :

function my_autoloader($className)
{
    require LIBRARY_PATH . '/' . $className . '.php';
}

Уловка в том, что если ваши файлы названы в честь классов, которые они содержат, это сразу же становится намного проще; -)

Вот почему классы часто именуются с использованием соглашения PEAR: My_Class_Name maps в файл My / Class / Name.php

16
ответ дан 8 December 2019 в 13:46
поделиться

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

Когда функция находится в классе, вы должны передать массив. В данном случае это статическая функция, потому что они передают класс Doctrine вместо экземпляра класса Doctrine.

0
ответ дан 8 December 2019 в 13:46
поделиться

Вся ваша инструкция верна.

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

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

1
ответ дан 8 December 2019 в 13:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: