2011-09-08 2 views
1

какВключает ли классы, которые вы не используете, влияет на производительность?

require "class.a.php"; 
require "class.b.php"; 
require "class.c.php"; 

class main{ 
function main(){ 
    if(condition_is_met(){ 
     $this->something = new A(); 
    }else{ 
     $this->something = new B(); 
    } 
} 

} 

Если файлы будут включены в проверке состояния с require_once, а не все время?

ответ

0

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

Может ли кто-нибудь сказать мне, можете ли вы объявить класс внутри оператора функции/if?

1

PHP должен открыть файл и проанализировать его, чтобы он имел какое-то влияние. Для нескольких файлов я бы не стал беспокоиться об этом, но он может выйти из-под контроля по мере увеличения ваших файлов. Вот почему есть автозагрузку, который позволяет загружать файлы классов только в случае необходимости, без длинного списка требует в верхней части файлов:

http://php.net/manual/en/language.oop5.autoload.php

Также посмотрите на spl_autoload_register:

http://www.php.net/manual/en/function.spl-autoload-register.php

+0

Поддерживает ли PHP предварительно скомпилированные версии исходных файлов, кэшированные или файлы анализируются и скомпилированы с каждым запросом? – Tomalak

+0

И используйте [Соглашение об именах файлов PSR-0] (https://groups.google.com/group/php-standards/web/psr-0-final-proposal?pli=1), чтобы свести к минимуму количество автозагрузчиков (если все ваши библиотеки используют PSR-0, у вас есть только один автозагрузчик) – arnaud576875

+0

@Tomalak, это основная цель кэширования кода операции (см. [APC] (http://pecl.php.net/packages/APC)). Без них PHP компилирует те же файлы снова для каждого запроса. – arnaud576875

1

Вопрос не ясен. В текущем коде я думаю, что все файлы будут включены, независимо от того, используете ли вы (объявляете переменную этих классов) или нет. Если вы не загрузите класс (ы), который вы не будете использовать, вы можете использовать функцию __autoload().

http://php.net/manual/en/language.oop5.autoload.php

+1

И используйте [Соглашение об именах файлов PSR-0] (https://groups.google.com/group/php-standards/web/psr-0-final-proposal?pli=1), чтобы свести к минимуму количество автозагрузчиков (если все ваши библиотеки используют PSR-0, у вас есть только один автозагрузчик) – arnaud576875

+0

Спасибо @ arnaud576875 за предложение :) – giga

0

В любое время вы используете включают или требуют, PHP в основном копировать/вставить код из файла required в код. Поэтому независимо от того, где вы это указываете, PHP все еще открывает файл, читая его и отбрасывая туда, на него не будет влиять блок if. Другими словами, запрос анализируется до того, как код действительно будет запущен, так что да, вы получите (очень маленький) рейтинг производительности, даже если требование будет помещено в блок if и никогда не будет запущено. Имейте в виду, это очень небольшое влияние. И наконец, если вы беспокоитесь об этом, я бы использовал require_once - это гарантирует, что этот синтаксический разбор не произойдет дважды, например, если второй файл requires первый файл, эта избыточность не будет равна второму результату.

+0

Я не думаю, что он анализируется, если вы используете его в условном блоке. Если я добавлю некоторые случайные символы в файл, тогда я получаю ошибку синтаксического анализа каждый раз, если требуются сверху, но если я помещаю их в блок if, то я получаю ошибки только в том случае, если условие выполнено. – Morpha

+0

Небольшое влияние? Не будет ли загрязнение руки доступным файловой системе (чтение диска) займет больше времени? – giga

+0

Ну да, чтение диска добавит немного накладных расходов, но мой ответ предполагал, что файлы были на локальной файловой системе (не смонтированы по сети), а на современной системе, по крайней мере, на SATA-накопителе емкостью 1,5 Гбит/с. Очевидно, что запуск этой системы со старым жестким диском ATA приведет к значительным результатам. Morpha - правильно, он не будет разбираться, но он все еще читается и заходит. – Chris

Смежные вопросы