Каков наилучший способ включить библиотеки PHP при использовании статического фабричного шаблона?
-
06-07-2019 - |
Вопрос
У меня есть несколько статических заводских шаблонов в моей 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;
}
}
}
Мне кажется, что во 2-м примере несколько вызовов Create() приведут к нескольким запросам из-за области действия вызова, даже если используется параметр require_once .
Это правда?Каков наилучший способ динамического включения библиотек в php в таком примере, как этот?
Спасибо!
Решение
Средство автоматической загрузки часто рассматривается как Зло, но оно довольно хорошо справляется с этими задачами.
Если вы можете получить хорошую файловую систему <-> сопоставление имени класса, чтобы вы могли, когда вам будет предоставлен класс для предоставления, найти его, тогда это сэкономит вам накладные расходы и загрузит классы только при необходимости.
Это работает и для статических классов, поэтому, как только статический класс попадает в область видимости, ему даже не нужно один раз вызывать тест require "включен ли файл", поскольку класс уже находится в таблице символов.
Тогда вы можете просто создать
require("autoloader.php");
$x = new Car();
$x = new Bike();
и он просто принесет их, когда это будет необходимо.
Видишь Php.net/__autoload для получения более подробной информации.
Другие советы
Я бы рекомендовал использовать автозагрузчик.
То есть, не используйте require_once()
требовать любой подкласс, но позволяет автозагрузчику вызывать функцию, которая может загружать класс, на который ссылается, при вызове new Truck()
или new Car()
.
Что касается вопроса об утечке памяти, то нет, require_once
область действия блока кода не ограничена.
Взгляните на _функция _autoload() _автоматическая загрузка().
Смысл функции require_once заключается в том, что независимо от области видимости вы не будете включать файл дважды и переопределять класс, вызывающий ошибку PHP.Так что не беспокойтесь об утечках памяти, если нажато require_once, класс def попадает в глобальную таблицу символов только один раз.
Но помимо этого, да, используйте автозагрузчик.