本帖最后由 moliyishengyuan 于 2010-10-15 15:20:35 编辑

解决方案 »

  1.   

    是在找不到应用方法的时候加载文件名==方法名的php文件
      

  2.   

    这个我当然知道,我是说为什么用include_once而不是用include!!!
      

  3.   

    include_once 确保只引入一次
    很多讲__autoload的地方  这个地方是官方吗? 不然都有可能是一个习惯问题
      

  4.   

    一个文件中操作不一定一定就需要每个类,很多都是有选在的,如此一来也就是需要的时候自动加载,不需要不加载就像循环中的判断相似,如果直接include那么就成了需不需要都要加载,如果你程序中执行10000个功能那么直接include的话就需要一次性10000个,而autoload就不是了
      

  5.   

    __autoload的运行机制是类实例化后加载类;
    你只有写了$var = new Test();才会执行__autoload,才会加载test.class.php;
    所以即使用include也只是加载了你用的类,没用的不会加载。
      

  6.   


    既然通过__autoload实现了这个机制,为什么__autoload里面还要用include_once,而不是include呢
      

  7.   

    总算找到源头了,http://cn.php.net/manual/en/language.oop5.autoload.php这里面官方的__autoload的讲解,使用的是include_once,但是底下也有认为include更好些。
      

  8.   

    to9楼:
    既然只要用到了没有的程序就进行加载,所以inlude_once和inlucde差不多了
      

  9.   

    include_once的消耗是include的3-4倍
      

  10.   

    网上的说法很好:include_once() 语句在脚本执行期间包括并运行指定文件。此行为和 include() 语句类似,唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。如同此语句名字暗示的那样,只会包括一次。
      

  11.   

    1、在php中使用require_once/include_once虽然方便,但是代价昂贵,据测试数据来看,require_once比require慢3-4倍,因为程序要检验是否加载,所以在php开发中,我们应该尽量使用require/include。
    2、上述的__autoload函数除了自动加载功能外还有让文件仅加载一次的功能
      

  12.   

    main.phpfunction __autoload($class_name)
    {
        include_once "./{$class_name}.class.php";
    }
    $t1 = new Test();
    print_r($t1);
    $t2 = new Test();
    print_r($t2);test.class.phpclass test
    {
        public $param1;
        public function run()
        {
            echo 'hello world';
        }
    }
    echo 'import';output:
    importtest Object ( [param1] => ) test Object ( [param1] => ) 
    说明test.class.php仅被加载一次
      

  13.   

    现在的情况是__autoload函数中用include_once其实是功能重复了,因为现在__autoload函数本省已经实现了仅加载一次的功能,文件不管大小,在现在情况下,__autoload中为include_once加载的,用include一定会加载;用include会加载的include_once也一定会加载。
      

  14.   

    我想LZ把__autoload的功能给理解错了,它主要是在实例化一个对象时,而又没有包含该类文件时,才会执行这个函数,至于这个函数里面做什么,是你LZ自己的主意,你可以在这里直接终止,当然也可以包含该类文件,以便实例化对象里面写include_once与include这两者的关系与__autoload这个函数,没有任何联系,写这两个凼数只是完成里面相应的功能而已,这两者的区别也就是上面所说的,我就不重复了
      

  15.   

    假如有1000个功能,其中有很多都是重复用到某些功能,那么:include //不判断直接加载
    include_once //判断,如果加载过了不加载
    包含文件所耗资源与判断相比未知(文件大小同样影响到包含的效率),个人认为应该是包含文件更好资源
      

  16.   

    晕,我当然清楚__autoload是加载文件的,我只是想告诉你们,__autoload里面用include更好。
      

  17.   

    晕,建议你试试我上面贴的代码,现在是
    在__autoload中用include      //如果加载过了不加载
    在__autoload中用include_once //如果加载过了不加载
    请你看清楚,是在__autoload中,你自己试下,这不是在__autoload外使用,你没有看到我实例化了两次,但只输出了一个import,这说明只导入了一次。晕!
      

  18.   

    不好意思,刚只稍微看了一下你的问题,所以答了之后,我自己都觉得有点不妥,但可惜的是,它不提供编辑功能,所以我就你上面写的例子再补充一下,我的看法
    $t1 = new Test();
    print_r($t1);
    $t2 = new Test();
    print_r($t2);这里,实例化两次,它只会执行一次_autoload函数,因为你在第一次new test()的时候,它已经完成了加载文件的动作,所以你说的在_autoload里面用include与include_once,可能你觉得用include_once会去判断该文件是否被包含,而include是直接包含,所以从这个方面来说,确实是这样的
      

  19.   

    官方解释:自动加载对象很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件列表。在 PHP 5 中,不再需要这样了。可以定义一个 __autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。 -------------------------------------------------------------
    这说明了当你实例化一个类时,如果类没有定义,会执行__autoload函数,里面怎么处理由你自定.
    一般而言,有人会在没有找到时加载相关的类文件.function __autoload($class_name)
    {
        include "./lib/{$class_name}.class.php";
    }这个是很好的方法,因为他只在需要时加载与类名同名的类文件.不需要时不加载.
    许多框架都有这样的机制,仅在需要时加载.有了上面这个函数,在这之前可以不 include任何文件.
    当然,这个里面还可以做其他东西.---------关于include_once和include,用include_once是不错的. 区别,只加载一次.其他的区别就不太清楚了-----第三个功能:你只要加载一次后,这个类内存中就有了.只会触发一次.
      

  20.   

    楼主的这个观点没错,
    不过有个前提,就是整个项目的class都是通过__autoload来载入的,
    如果项目中有些地方直接使用了include_once('xxx.php'),
    那么还是在__autoload中用_once更好点
      

  21.   

    include_once或是require_once,为什么不直接用include和reuqire。
    已加载就不载虽然 __autoload 只在类定义找不到时才会被调用但 *_once 仍不失为好习惯
      

  22.   

    function __autoload($class_name)这里的__autoload可以改为别的名称吗?
      

  23.   

    include_once或是require_once,而不用include
    我的理解是这样的,一般你inlclude(_once)后,内存是有数组专门记录这个文件的,事实上它也是可以打印出来的.但它保证了文件的唯一性.即只引用一次.否则,如果你动态改了一个文件,再次引用时,会盖前面的那个.这会使问题复杂化.include_once的开销多会一个检查,下次include时,会检查在不在相关已引用数组它保证了你的程序是绝对可控的.
      

  24.   


    可以
    spl_autoload_register
      

  25.   

    hehe, 从头看到尾,感觉大家都是在把楼主已经很清楚的事情反复讲解给楼主听。除了 24 楼的回答,这是我看到的唯一正面回答楼主问题而且看上去很有道理的回帖 :)学习了!
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)[/size]
      

  26.   

    不过仔细看看,似乎还是不对。即使项目中别的地方没有使用 __autoload 而是直接 include_once 来加载了某些 PHP 文件,但只要那个特定的 class 已经被加载了,__autoload 中的代码就不会再被执行了,也就不存在 _once 不 _once 的事情了呀?……
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)[/size]
      

  27.   

    呵呵,明白大家的意思了,我在项目中的应用时这样的,有个工厂类,通过spl_autoload_register将类的静态方法注册进自动加载函数序列。然后所有的action钱只包含这个工厂类,然后使用工厂类的静态方法即可,这样应该不会大家说的有的地方仍使用include_once而出现加载重复的问题。