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

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

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
7
0
9 396
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

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

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

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

и он просто приведет их, когда это будет необходимо.

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

Является ли автозагрузка синтаксическим сахаром, требующим, не ограниченным локально?

thesmart 06.11.2008 01:04

Когда файл "required" содержит определения классов, проблем с локальной областью видимости нет. PHP не поддерживает «внутренние классы», такие как Java; все классы определены на «верхнем уровне» текущего пространства имен.

Bill Karwin 06.11.2008 01:11

Взгляните на __autoload () функция.

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

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

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

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

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

Другие вопросы по теме