php重新评估包含的文件

时间:2012-03-22 07:40:01

标签: php oop include autoload

我在PHP中读到了类自动加载,但直到现在我还不明白为什么要使用__autoload()方法?

我读了那个

  

PHP不使用   这个方法因为它有方便的小包含功能,   include_once和require_once,阻止你加载它   文件不止一次,但与编译语言不同, PHP重新评估   这些表达在评估期间每次都反复出现   包含一个或多个这些表达式的文件被加载到   此站点中的运行时why we should use autoloading

但我不明白上述声明中PHP 重新评估的含义是什么!! 为什么要求 - 一次不解决多次加载php文件的问题?

4 个答案:

答案 0 :(得分:1)

只要遇到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 :(得分:1)

  

但直到现在我还不明白为什么要使用它

当您对工作进行结构化和组织时,由于组织结果,您会得到许多类似的类文件。更简单的例子是一个mvc,但不仅如此,任何自定义结构都会导致类似的文件包含一个类,那么由于你把它们放在同一个文件夹中的相似性,你也可以使用一个通用的文件命名约定,例如你可以有一个控制器和模型目录..检查示例文件:employeeModel.phpstatisticsModel.phpindexController.phperrorController.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 =每个文件触发一次,自动执行任务,因此您可以直接执行一个类,而无需考虑包含它。

答案 2 :(得分:1)

当您更广泛地阅读original article时,Why you should use an autoload function in PHP会更清晰(见下文):

它只是说__autoload()比include_once()更聪明,因为函数include_once()必须在需要类时显式编码,并且因为每次出现时都需要处理此函数以便知道参数中给出的文件是否已加载。

相反,另一个函数__autoload()只能为您可能需要的几个类调用一次。然后,只有在缺少类定义时,PHP才会尝试加载相应的源文件。

我们可以通过以下方式总结这个论证:每个类/函数源需要一个include_once(),而对于具有相同位置规则的一组类源,只有一个__autoload()可能就足够了。

文章的片段:

{{3}}

  

加载类是管理Java等语言的东西   和C#不需要担心,类加载器都内置于   编译器。

 [...]
     

PHP不使用此方法,因为它有方便的小包含函数,include_once和require_once,这会阻止你   从多次加载同一个文件,但不像编译   在语言中,PHP在重复期间重复评估这些表达式   评估期间每次包含一个或多个这些文件   表达式被加载到运行时中。这就是标准PHP的地方   在PHP 5中引入的库(SPL)和精彩的小_autoload   函数可以提高PHP代码的速度和一致性。

     

__ autoload是一个神奇的函数,你定义它可以让PHP在你没有加载类的时候告诉你,但是那个类   需要加载。

答案 3 :(得分:0)

自动加载意味着您​​需要在脚本中自动包含某些类,例如

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

要避免每个脚本的此类代码,您可以使用php的自动加载功能