Просмотр поста

.
L!MP
Автоматическое подключение классов.

Теория (совсем чуть-чуть).

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

Практика / Подготовка.

В корне нашего сайта создадим файл /index.php и папку /classes в которой будут размещатся файлы классов используемые в нашем проекте.
Создадим два простых класса, которые в момент их обьявления будут с нами здороваться и сообщать свои имена:

Файл /classes/a.php

<?php
class A {
	function __construct() {
		echo 'Привет! Я класс А.';
	}
}

Файл /classes/b.php

<?php
class B {
	function __construct() {
		echo 'Привет! Я класс B.';
	}
}


Теперь попробуем инициализировать эти классы в файле /index.php

Файл /index.php

<?php

$a = new A;
$b = new B;


Запустив наше приложение мы получим ошибки Fatal error с сообщением о том, что наши классы не найдены.

Практика / Использование стандартной ф-ции __autoload().

Исправим файл /index.php и напишем в нем нашу функцию автозагрузки классов.
Для этого мы будим использовать "магическую" функцию __autoload().
Её "магия" в том, что она принимает в качестве своего аргумента - имя класса, который PHP не может найти.
В самой же функции нужно реализовать логику для определения местоположения класса и его загрузки.

Файл /index.php

<?php

function __autoload($class) {
	/*
	Важный момент:
	имя класса, должно совпадать с именем файла в котором он описан!
	*/

	if (file_exists('./classes/' . $class . '.php')) //проверяем есть ли класс $class в папке /classes
		include_once './classes/' . $class . '.php'; //подключаем файл класса
}

$a = new A;
$b = new B;


Снова запустим наше приложение: ошибки исчезли, вместо них мы видим приветствие от двух наших классов, а это значит что автозагрузка классов работает.

Практика / Использование собственной ф-ции с помощью spl_autoload_register()().

Теперь попробуем переименовать нашу ф-цию __autoload() к примеру в "hendlerAutoload" и запустим наше приложение - ошибки вернулись, и не удивительно, ведь наша функция потеряла свою "магичность".
Исправим ситуацию при помощи SPL:

Файл /index.php

<?php

//определяем собственную ф-цию автозагрузки...

function hendlerAutoload($class) {
	if (file_exists('./classes/' . $class . '.php'))
		include_once './classes/' . $class . '.php';
}

//... и регистрируем её

spl_autoload_register('hendlerAutoload');

$a = new A;
$b = new B;


Так же, при помощи spl_autoload_register() мы можем зарегистрировать в качестве автозагрузчика метод какого-либо класса:

spl_autoload_register(array('Class', 'hendlerAutoload')); // где Class - имя класса в котором описан наш автозагручик


З.Ы: немного скомкано (особенно к концу), по этому задаем вопросы и если есть что добавить - милости прошу