【问题标题】:php re-evaluate included filesphp重新评估包含的文件
【发布时间】:2012-03-22 07:40:00
【问题描述】:

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

我读到了

PHP 不使用 这种方法是因为它有方便的小包含功能, include_once 和 require_once,这会阻止您加载相同的内容 文件不止一次,但与编译语言不同,PHP 重新评估 这些表达式在每次评估期间一遍又一遍 包含一个或多个这些表达式的文件被加载到 本站运行时why we should use autoloading,

但是我不明白上面语句中的PHP re-evaluates是什么意思!! 为什么require-once不能解决多次加载php文件的问题?

【问题讨论】:

  • 这个 sn-p 在没有上下文的情况下完全没有意义。 “PHP 不使用这种方法” --> 什么方法?坦率地说,作者听起来不太有说服力。
  • 对不起,我修改了,现在可以了。

标签: php oop include autoload


【解决方案1】:

original article 更广泛地阅读时会更清晰(见下文):

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

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

我们可以这样总结这个论点:每个 Class/Function 源都需要一个 include_once(),而对于具有相同位置规则的一组 Class 源,只需要一个 __autoload() 就足够了。

文章摘录:

Why you should use an autoload function in PHP

类的加载是 Java 之类的托管语言 和 C# 不用担心,类加载器内置在 编译器。

 [...]

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

__autoload 是一个由您定义的神奇函数,它使 PHP 在没有加载类时通知您,但该类 需要加载。

【讨论】:

    【解决方案2】:

    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;
    }
    

    使用自动加载时,文件包含的逻辑只会被触发一次,第一次需要该类。

    【讨论】:

    • 我在自动加载函数里面做了一个echo语句,我改变了echo语句并刷新了页面,视图没有改变!这意味着对象只被初始化一次。但是我应该怎么做才能重新初始化对象?我尝试关闭浏览器并重新打开它,但它并没有改变内容。
    • 对不起,什么?所有这些都不适用于刷新页面,仅适用于在同一个请求中多次执行相同的操作。
    • 不是它触发对象一次,即使我改变了构造函数的内容,视图也没有改变!
    【解决方案3】:

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

    当您对工作进行结构化和组织后,由于组织的原因,您会拥有许多相似的类文件。更简单的示例是 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 = 每个文件触发一次,使事情自动化,因此您可以直接执行一个类而无需包含它。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-02-24
        • 1970-01-01
        • 2020-08-03
        • 1970-01-01
        • 2018-01-05
        • 2020-08-19
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多