Каков наилучший способ включить библиотеки PHP при использовании статического шаблона фабрики? - PullRequest
7 голосов
/ 06 ноября 2008

У меня есть несколько статических шаблонов фабрики в моей библиотеке 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 AND Truck.php, даже если может понадобиться только один или другой. Насколько я знаю, require / include и их ... однажды вариация включают библиотеки в той же области, что и вызов. Это правда?

Если это так, я считаю, что это приведет к утечке памяти:

    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 в такой пример?

Спасибо!

Ответы [ 4 ]

7 голосов
/ 06 ноября 2008

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

Если вы можете получить хорошее сопоставление имен файловой системы <->, чтобы вы могли найти его, когда ему будет предоставлен класс, и тогда вы сэкономите накладные расходы и загрузите классы только при необходимости.

Он работает и для статических классов, поэтому, как только статический класс находится в области видимости, ему даже не нужно даже вызывать тест «is file includes that» один раз, поскольку Class уже находится в таблице символов.

Тогда вы можете просто создать

require("autoloader.php"); 
$x = new Car();  
$x = new Bike(); 

и он будет просто вводить их при необходимости.

Подробнее см. Php.net / __ autoload .

2 голосов
/ 06 ноября 2008

Я бы рекомендовал использовать автозагрузчик .

То есть, не используйте require_once() для запроса какого-либо подкласса, но позволяет автозагрузчику вызывать функцию, которая может загрузить ссылочный класс при вызове new Truck() или new Car().

Что касается вопроса утечки памяти, нет, require_once не ограничен блоком кода.

1 голос
/ 06 ноября 2008

Посмотрите на функцию __ autoload () .

0 голосов
/ 06 ноября 2008

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

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

...