PHP переоценить включенные файлы - PullRequest
0 голосов
/ 22 марта 2012

Я читал об автозагрузке классов в PHP, но до сих пор не понимал, почему мы должны использовать метод __autoload ()?

Я читал, что

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

, но я не понимаю, в чем смысл PHP переоценивает в приведенном выше утверждении !!почему require-Once не решает проблему загрузки php файла более одного раза?

Ответы [ 4 ]

1 голос
/ 22 марта 2012

Оригинальная статья становится более понятной, когда вы читаете ее более широко (см. Ниже):

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

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

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

Фрагмент статьи:

Почему вы должны использовать функцию автозагрузки в PHP

Загрузка классов - это то, что управляет такими языками, как Java и C # не нужно беспокоиться, загрузчики классов встроены в компилятор.

 [...]

PHP не использует этот метод, потому что у него есть удобные небольшие функции include, include_once и require_once, которые мешают вам от загрузки одного и того же файла более одного раза, но в отличие от скомпилированного язык, PHP переоценивает эти выражения снова и снова во время период оценки каждый раз, когда файл, содержащий один или несколько из них выражения загружаются в среду выполнения. Вот где стандартный PHP Библиотека (SPL), представленная в PHP 5, и замечательный маленький _autoload функция входит, чтобы повысить скорость и единообразие вашего кода PHP.

__ autoload - это магическая функция, которую вы определяете, которая позволяет PHP сообщать вам, когда у него не загружен класс, но этот класс должен быть загружен.

1 голос
/ 22 марта 2012

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

for ($i = 0; $i < 100; $i++) {
    include_once 'foo.php';
    new Foo;
}

Это оценит ("запустит") include_once 100 раз. Это может быть чем-то вроде замедления. С другой стороны:

for ($i = 0; $i < 100; $i++) {
    new Foo;
}

При использовании автозагрузки логика включения файла будет срабатывать только один раз, когда в первый раз нужен класс.

1 голос
/ 22 марта 2012

но до сих пор я не понимал, почему мы должны его использовать

Когда вы структурировали и организовали свою работу, из-за организации получается, что у вас много похожих файлов классов,Более простой пример - mvc, но не только, любая пользовательская структура приведет к созданию похожих файлов, содержащих класс, а затем из-за сходства вы поместите их в одну и ту же папку, а также будете использовать общее соглашение об именах файлов, например, вы можете иметьконтроллер и каталог модели .. проверьте файл примера: employeeModel.php, statisticsModel.php, indexController.php, errorController.php

Хорошо, вы можете воспользоваться этим фактом, проверьте эту настроенную функцию автозагрузки:

/*** function to include model and view classes ***/
    function __autoload($class_name) 
    {if(__DEBUG) eval(__DEBUG_EVAL);

          /*** Load a model class ***/  
          $mfile=__SITE_PATH .'model/'.$class_name.'.php';//echo 'model file'.NL;v($file);
           if (file_exists($mfile)){
            include ($mfile);
                if(__DEBUG) //store debug info before include
                    eval('error_log("autoload Success file exists: ".$mfile.NL);');
            return true;
            }

          /*** Load a view class ***/   
          $cfile=__SITE_PATH .'view/'.'/'.substr($class_name,0,-4).'/'.$class_name.'.php';//v($file);
           if (file_exists($cfile)){ 
            include ($cfile);
                if(__DEBUG) //store debug info before include
                    eval('error_log("autoload Success file exists: ".$cfile.NL);');
            return true;
            }
            return false;
    }

Также имеется несколько строк для отладки, которые можно легко удалить позже.Из-за схожести вещей он может сам решить, что включать , а также сообщать об ошибках при их возникновении. Без этой функции автозагрузки вы должны позаботиться о том, чтобы файлы классов были доступны перед использованием. Также эта функция позволит включить файл один раз, если вы тщательно проверите, он не использует include_once, это означает, что автозагрузка срабатывает только тогда, когда файл ранее не просматривался, в отличие от простого включения файлакоторый запускается каждый раз, когда код выполняется, как это очень правильно..

0 голосов
/ 22 марта 2012

Автозагрузка означает, что если вам нужно, чтобы некоторые классы автоматически включались в сценарии, такие как

require_once ("class.user.php");
require_once ("class.module.php");

Чтобы избежать такого кода для каждого скрипта, вы можете использовать функцию автозагрузки php

...