Вопрос

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

bool spl_autoload_register  ([ callback $autoload_function  ] )

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

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

вызовет ли require запуск?значит, я также могу зарегистрировать множество функций автоматической загрузки?

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'));

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

Это было полезно?

Решение

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

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

  • простое имя функции : 'my_function'
  • статический метод класса : array('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 сопоставляет с файлом My/Class/Name.php

Другие советы

Все ваше утверждение верно.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top