PHP include_once与require_once区别

①作用及用法 

  可以减少代码的重复 

  include(_once)("文件的路径")与require(_once)("文件的路径") 

②理解 

  说白了,就是用包含进来的文件中的内容 代替 include(_once),require(_once)那一行 

③注意   

  include/require 包含进来的文件必须要加<?php ?>因为在包含时,首先理解文件内容是普通字符串,碰到<?php ?> 标签时,才去解释 

④路径 

  可以用绝对路径,也可以用相对路径;windows下正反斜线都可以,linux下只认正斜线,所以最好用正斜线 

⑤区别 

  include是包含的意思,找不到文件时,会报warning的错误,然后程序继续往下执行 

  require是必须的意思,找不到文件时,会报fatal error (致命错误),程序停止往下执行 

  加once后,系统会进行判断,如果已经包含,则不会再包含第二次 

    eg:有一个a.php文件 内容是<?php $a++ ;?> 

      在b.php文件中的内容是 $a=5; require_once("a.php"); echo $a; require_once("a.php"); echo $a; 

      结果第一处输出的是6, 第二处输出的还是6,说明。。_once只包含一次 ,如果不加once,则第二处输出的会是7 

⑥取舍 

  比如是系统配置,缺少了,网站不让运行,自然用require,如果是某一段统计程序,少了,对网站只是少统计人数罢了,不是必须要的,可以用include 

  而加不加once是效率上的区别,加上once,虽然系统帮你考虑了只加载一次,但系统的判断会是效率降低,因此,更应该在开发之初,就把目录结构调整好,尽量不要用_once的情况。 

⑦特殊用法 

  利用include/require返回被包含页面的返回值 

    a.php页面中: ..... return $value; b.php页面中:$v = include("a.php"); 
<!--[endif]--> 

这个用法在做网站配置的时候会偶尔碰到!

PHP包含文件(require/include/require_once/include_once/__autoload/spl_autoload)分析总结

02-24

author: selfimprrnblog: [url=http://blog.csdn.net/lgg201]http://blog.csdn.net/lgg201[/url]rnmail: [url=mailto:lgg860911@yahoo.com.cn]lgg860911@yahoo.com.cn[/url]rn本文博客地址: [url=http://blog.csdn.net/lgg201/archive/2011/02/24/6204951.aspx]http://blog.csdn.net/lgg201/archive/2011/02/24/6204951.aspx[/url]rnrn四种语法的差异rn在PHP中,包含一个文件有4种方式:require,require_once,include,include_once.其中require_once/include_once与require/include相比,在功能上,仅仅是增加了一个是否已经加载过的检测,require_once/include_once在一次PHP执行过程中,保证一个文件只被加载一次.rnrequire_once/include_once这样只加载一次的功能,通常是为了避免发生函数/类重定义等异常,或者多次包含同一文件导致的变量覆写.rn在说明了_once版本和没有_once的版本之间的区别后,我们同样需要知道require和include之间的区别.下面是php手册对require的解释:rnrequire() is identical to include() except upon failure it will also produce a fatal E_ERROR level error. In other words, it will halt the script whereas include() only emits a warning (E_WARNING) which allows the script to continue.rn可以看出,require和include之间的区别仅在于发生错误时(比如被包含文件查找不到),require引发一个E_ERROR级别的错误,而include引发一个E_WARNING级别的错误.(E_ERROR级别的错误会中断脚本执行)rnrequire_once和include_once之间的区别也就不言而喻了.rnrn一个需要注意的点rnrequire/require_once/include/include_once都是语法结构,不是函数,可以通过function_exists验证rnrn性能问题rnrequire/require_once的性能问题,在[url=http://blog.csdn.net/lgg201/archive/2011/02/14/6184745.aspx]http://blog.csdn.net/lgg201/archive/2011/02/14/6184745.aspx[/url]中已经做了比较详细的阐述,这里仅仅列举一个用以发现性能问题的示例:rnmain.phprn[code=PHP]\n", $rusage['ru_utime.tv_sec'] + $rusage['ru_utime.tv_usec'] / 1000000 - $cpu_time_tmp[0], $rusage['ru_stime.tv_sec'] + $rusage['ru_stime.tv_usec'] / 1000000 - $cpu_time_tmp[1]);rn $cpu_time_tmp = array();rnrnrn$times = 1000000;rnprint " 测试用例运行次数: $times";rnrnprint "require方式消耗: ";rncputime_start();rnwhile($i ++ < $times) test_require("required_require.php");rncputime_end();rnrnprint "require_once方式消耗: ";rncputime_start();rnwhile($j ++ < $times) test_require_once("required_requireonce.php");rncputime_end();rn?>rn [/code]rnrnrequired_require.phprn[code=PHP][/code]rnrnrequired_require_once.phprn[code=PHP][/code]rnrn输出结果:rn测试用例运行次数: 1000000rnrequire方式消耗: user_cpu: 0.56000000, system_cpu: 0.01000000rnrequire_once方式消耗: user_cpu: 2.84000000, system_cpu: 1.05000000rn多次运行,结果稳定. 可以看出require_once与require相比,系统cpu消耗是其105倍,用户cpu消耗约为5倍左右, 总体cpu时间消耗是其8倍左右.rnrn自动加载rnPHP引入了__autoload机制, 如果脚本解释执行过程中定义了__autoload函数, 那么当需要类而类未定义的时候, 就会将类名作为参数, 调用__autoload函数, __autoload由用户程序员自己来实现一个文件的加载机制.rn在使用__autoload机制时,我们需要确保文件层次结构,命名有严格的规范.rn自动加载的应用场景:rn当我们需要一个动态的加载机制的时候,比如使用可变类名的情况(new $classname),在这种情形下,我们为了避免一次去加载所有可能的类定义文件,通常会有一个规则去require类定义文件,那我们可以把这个require放入到__autoload中,对其做一个统一的规范.rnrnspl自动加载rn__autoload解决了类的自动加载问题,但是,当系统比较大的时候,可能一个autoload并不能完全的(或难度较大)规范自动加载规则(特别是在与其他系统协同工作时).那我们首先想到的就是提供多个autoload功能的函数来解决这个问题,spl自动加载就是解决这个问题的.rn通过函数spl_autoload_register($autoload_callback, $throw, $prepend)/spl_autoload_unregister来维护一个autoload函数的栈, 三个参数都是可选的, $autoload_callback是要加入的函数名, $throw指函数注册过程发生错误(比如提供的函数名不存在)时是否抛出异常, $prepend用来指明是否是向autoload栈的前面插入.rnrn总结rn关于"包含文件",能够想到的就这么多,在这里做一个小的总结:rn1. 尽可能自定义一个require_once函数来管理这个once的加载机制, 这样做不仅有性能上的提升,而且同时对"包含文件"进行了一个统一的管理rn2. 对于利用面向对象特性较多的系统,应尝试使用autoload机制, 当系统比较复杂时, 可以使用spl_autoload_xxx对autoload进行管理rn3. 对于非文件域需要的(比如类的继承等)"包含文件", 尽可能的把require/include放入到函数等具体的处理过程中,在真正需要的时候条件包含.rn比如:rncommon.func.phprn[code=PHP][/code]rnuser.func.phprn[code=PHP][/code]rnA.class.phprn[code=PHP][/code]rnB.class.phprn[code=PHP][/code]rn4. 这一点实际是一个老生长谈的问题, 文件结构和命名的规范...无论你是否使用autoload, 无论你是否使用自定义require_once, 无论你是否使用可变类名(new $classname()方式), 都需要遵循一个统一的文件结构和命名规范, 一旦这个规范确立了, 无论这个规范有多烂, 都要遵循它, 当然不是不能更改, 但是更改需要有一个统一的规划, 并且这种对规范的修改带来的对旧有代码的改动工作, 最好开发工具进行修改.rn5. 与第四点同样重要的问题, 就是代码长度的问题, PHP是解释型语言, 多一个无用的东西, 每次执行就都会多一些消耗, 哪怕那只是一个函数定义....所以, 要尽可能的让自己的php文件功能单一, 让每次require都高效的包含所需文件rnrn关于php的文件包含, 我只有这么多的认识, 希望有更多/更好这方面认知的朋友能够不吝赐教/拍砖

没有更多推荐了,返回首页