Каков наилучший способ включить библиотеки PHP при использовании статического фабричного шаблона?

StackOverflow https://stackoverflow.com/questions/266803

Вопрос

У меня есть несколько статических заводских шаблонов в моей 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 область действия блока кода не ограничена.

Смысл функции require_once заключается в том, что независимо от области видимости вы не будете включать файл дважды и переопределять класс, вызывающий ошибку PHP.Так что не беспокойтесь об утечках памяти, если нажато require_once, класс def попадает в глобальную таблицу символов только один раз.

Но помимо этого, да, используйте автозагрузчик.

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