2012-03-22 3 views
0

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

Я читал, что

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

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

+1

Этот фрагмент абсолютно бессмыслен без контекста. «PHP не использует этот метод» -> * какой метод *? И, откровенно говоря, автор звучит не очень убедительно. – Jon

+0

@PalAla ссылка не работает! – Songo

+0

Извините, я изменяю его, теперь он работает. – palAlaa

ответ

1

original article более ясно, когда вы читаете это более широко (см):

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

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

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

Отрывок из статьи:

Why you should use an autoload function in PHP

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

[...] 

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

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

0

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

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

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

1

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

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

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

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

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

+0

Я делаю оператор эха внутри функции автозагрузки, меняю оператор эха и обновляю страницу, вид не изменяется! это означает, что объект инициализируется только один раз. но что я должен сделать, чтобы повторно инициализировать объект? Я пытаюсь закрыть браузер и снова открыть его, но он не изменяет содержимое. – palAlaa

+0

Извините, что? Все это не относится к обновлению страниц, а только к тому, чтобы делать одно и то же несколько раз в рамках одного запроса. – deceze

+0

Не запускайте объект один раз, и даже я меняю содержимое конструктора, представление не меняется! – palAlaa

1

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

Когда вы структурировали и организовали свою работу, потому что организации следует, что у вас есть много подобных файлов классов. Более простым примером является 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, это означает, что автозагрузка срабатывает только тогда, когда файл не был замечен раньше, в отличие от простого включения файла, который запускается каждый раз, когда код выполняется, так как очень правильно декодирует его.

Заключение Autload = срабатывает один раз в файл, автоматизирует все, поэтому вы выполняете класс напрямую, не заботясь о его включении.

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