В моей библиотеке PHP есть несколько статических фабричных шаблонов. Однако объем памяти выходит из-под контроля, и мы хотим уменьшить количество файлов, требуемых во время выполнения. Вот пример того, где мы находимся сегодня:
require_once('Car.php');
require_once('Truck.php');
abstract class Auto
{
// ... some stuff ...
public static function Create($type)
{
switch ($type) {
case 'Truck':
return new Truck();
break;
case 'Car':
default:
return new Car();
break;
}
}
}
Это нежелательно, потому что Car.php И Truck.php должны быть включены, даже если может потребоваться только один или другой. Насколько мне известно, require / include и их вариант ..._ Once включают библиотеки в той же области, что и его вызов. Это правда?
Если да, то я считаю, что это приведет к утечке памяти:
abstract class Auto
{
// ... some stuff ...
public static function Create($type)
{
switch ($type) {
case 'Truck':
require_once('Truck.php');
return new Truck();
break;
case 'Car':
default:
require_once('Car.php');
return new Car();
break;
}
}
}
Мне кажется, что во втором примере несколько вызовов Create () приведут к нескольким требованиям из-за объема вызова, даже если используется аромат require_once.
Это правда? Как лучше всего динамически включать библиотеки в php в таком примере?
Спасибо!






Средство автозагрузки часто называют злом, но оно отлично справляется с этой задачей.
Если вы можете получить хорошее сопоставление файловой системы <-> classname, чтобы вы могли, когда вам предоставлен класс для предоставления, найти его, тогда это сэкономит вам накладные расходы и загрузит классы только тогда, когда это необходимо.
Он работает и для статических классов, поэтому, как только статический класс попадает в область видимости, ему даже не нужно один раз вызывать тест «есть ли файл еще» на требовании, потому что класс уже находится в таблице символов.
Тогда вы можете просто создать
require("autoloader.php");
$x = new Car();
$x = new Bike();
и он просто приведет их, когда это будет необходимо.
Подробнее см. Php.net/__autoload.
Когда файл "required" содержит определения классов, проблем с локальной областью видимости нет. PHP не поддерживает «внутренние классы», такие как Java; все классы определены на «верхнем уровне» текущего пространства имен.
Взгляните на __autoload () функция.
Я бы рекомендовал использовать автозагрузчик.
То есть не используйте require_once(), чтобы требовать какой-либо подкласс, но позволяет автозагрузчику вызывать функцию, которая может загрузить указанный класс, когда вы вызываете new Truck() или new Car().
Что касается вопроса об утечке памяти, нет, require_once не ограничивается блоком кода.
Суть функции require_once в том, что независимо от области действия вы не будете включать файл дважды и переопределять класс, вызывающий ошибку PHP. Так что не беспокойтесь об утечках памяти, если требуется require_once, класс def попадает в глобальную таблицу символов только один раз.
Но кроме этого, да, используйте автозагрузчик.
Является ли автозагрузка синтаксическим сахаром, требующим, не ограниченным локально?