Любой способ избежать загрузки неиспользуемых классов для не-oo приложения? - PullRequest
4 голосов
/ 17 августа 2010

Мое приложение использует «центральный» контроллер страниц, который захватывает кучу файлов (я стесняюсь сказать, библиотеки), каждый из которых содержит несколько связанных классов, используя require_once, перед получением запроса.Как в:

require_once (dir_lib . 'db.php');              
require_once (dir_lib . 'uuid.php');            
require_once (dir_lib . 'data.php');            
require_once (dir_lib . 'token.php');           
require_once (dir_lib . 'logs.php');            
require_once (dir_lib . 'time.php');

и т.д ...

Я не удосужился проверить использование памяти до недавней установки (удивительной, но гигантской) библиотеки HTML Purifier и взглянуть на нее.автозагрузчик.Судя по всему, автозагрузчик не включен, каждый экземпляр скрипта теперь весит 537 килобайт памяти.(Я понятия не имею, для чего нужен встроенный автозагрузчик, если это конечный результат, но я отвлекся). Без очистителя HTML большинство экземпляров по-прежнему весят более мегабайта.

Чтение о Функции автозагрузки PHP Складывается впечатление, что автозагрузчик предназначен исключительно для ООП.За исключением библиотеки очистителя, я использую очень мало объектно-ориентированного кода.Я просто неправильно понимаю концепцию?Есть ли другой практический способ избежать слепой загрузки группы классов, которые могут не понадобиться для каждого запроса?Мне просто лень пытаться включить их всех заранее?

РЕДАКТИРОВАТЬ -

Повторяю этот комментарий здесь, чтобы уточнить, что я имел в виду под не-oo, если это имеет большое значение:

Я в основном использую классы вместо пространств имен без использования (почти) какого-либо реального ООП.То есть класс «DBFunctions» может содержать, например, функции «execute» и «getRow».Функции вызываются с помощью статического вызова метода, такого как «dbFunctions :: execute ($ sql)».

Ответы [ 3 ]

1 голос
/ 18 августа 2010

Автозагрузка PHP5 предназначена только для загрузки классов на лету. В вашем приложении может использоваться только одна функция автозагрузки (но см. Ниже). Прочитайте документы для автозагрузки для подробностей. По сути, вы можете определить функцию __autoload (), которая будет загружать любой файл, который вы хотите (или, если хотите, делать что угодно), содержащий любые классы, которые вы хотите, когда PHP пытается вызвать класс, который еще не загружен.

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

Если вы только начинаете с ОО в небольших проектах, вы, вероятно, просто хотите __autoload (), но если вы хотите интегрировать библиотеки, такие как HTMLPurifier, который использует spl_autoload, Google для spl_autoload для документов, они Первые результаты.

1 голос
/ 18 августа 2010

Есть ли особая причина, по которой эти функциональные файлы не являются классами? Единственное, о чем я могу думать, это совместимость с PHP4, но автозагрузка в PHP4 все равно не существует.

Достаточно просто обернуть эти существующие файлы кода в class DBFunctions { ... } и добавить префиксы к вызовам функций с DBFunctions::, чтобы автозагрузчик заработал (после установки обратного вызова spl_autoload_register ()), и это того стоит , Это все еще стилистически процедурно, если вы хотите сохранить код таким образом, и достойный шаг к OOPификации всей вашей кодовой базы, если вы хотите пойти по этому пути.

(А HTML Purifier - это слон, вы уже проверяли встроенный в PHP фильтр функций?)

1 голос
/ 17 августа 2010

Использование автозагрузки не должно сказываться на производительности, поскольку сам класс не загружается до тех пор, пока он не будет вызван или использован. Конструкция автозагрузки в основном загружает класс по мере необходимости, если он еще не был создан.

Найдите в коде, где класс был создан первым. Если файлы классов не создаются автоматически, это не займет никакой памяти. Возможно, не все были созданы, но не сброшены, когда не нужны.

Когда вы найдете, где каждый экземпляр был создан или тот, который вы можете использовать, тогда:

//Gets the object name using the class.
echo get_class($classinstance) , "\n";

Вы можете справиться с этим, установив несколько точек останова, используя memory_get_peak_usage().

//Output memory usage at start of class instanciation.
echo memory_get_usage()
#memory_get_peak_usage() prior to 5.2.1.

$classobject1 = new theclass();

//Output memory usage after class instanciation.
echo memory_get_usage()

Теперь попробуйте то же самое, но на этот раз, используя unset () после использования класса:

//Output memory usage at start of class instanciation.
echo memory_get_usage()
#memory_get_peak_usage() prior to 5.2.1.

$classobject1 = new theclass();

unset($classobject1);

//Output memory usage after class instanciation.
echo memory_get_usage()

Таким образом, теоретически, можно сбросить любой неиспользуемый экземпляр в приложении, найти большие объекты, отладить.

Это разъясняет комментарии @ greg относительно ООП:

Взять этот кусок как образец:

class Tun{
    private $run = 'i\'m running';

    function run(){
        echo $this->run;
    }
}

echo Tun::run;

Выход:

Error: Fatal error: Undefined class constant 'run' in C:\Work\pro\debug.php on line 16

Вышеприведенный пример потому, что ссылается на функцию, которая использует ООП, в данном случае закрытую переменную класса $run. Поскольку класс не создан (экземпляр объекта), он выдаст ошибку. Итак, да, вы можете использовать функции внутри класса по ссылке, но они в основном должны быть простыми процедурными или постоянными ссылками.

Надеюсь, это поможет.

...