当前位置:首页 » 编程语言 » phpifrequire

phpifrequire

发布时间: 2023-05-14 16:20:13

1. 从php核心代码分析require和include的区别

在php手册中:
require() is identical to include() except upon failure it will also proce 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.
就是说在失败的时候,require是会中止php运行的,而include是可以继续运行的。
倒底有什么样的区别呢?我们带着这个疑问来一起进入PHP的核心代码。
下面是一个PHP运行过程的图(这个图是出自哪里的?鸟哥画的?)

补习一下:lex是代码扫描器,扫描代码用的,yacc是Yet Another Compiler Compiler,作用是把任何一种代码的语法转成yacc语法,yacc就是解析器(真TMD绕)。
lex在c下的后缀是*.l yacc是*.y
正题
下面看操作记录:
cc@cc-laptop:/opt/workspace$ svn checkout http://svn.php.net/repository/php/php-src/branches/PHP_5_3 php-src-5.3
从svn取最新的php源代码。
开始深入:
cc@cc-laptop:/opt/workspace/php-src-5.3$ find . -type f -name “*.l” -exec grep -Hn “require_once” {} \;
./Zend/zend_language_scanner.l:1093:”require_once” {
寻找lex代码扫描器文件中出现require_once的地方,zend_language_scanner.l的1093行。
1093 “require_once” {
1094 return T_REQUIRE_ONCE;
1095 }
然后再搜一下T_REQUIRE_ONCE,
cc@cc-laptop:/opt/workspace/php-src-5.3$ find . -type f -name “*.y” -exec grep -Hn “T_INCLUDE” {} \;
./Zend/zend_language_parser.y:52:%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
./Zend/zend_language_parser.y:985: | T_INCLUDE expr { zend_do_include_or_eval(ZEND_INCLUDE, &$$, &$2 TSRMLS_CC); }
./Zend/zend_language_parser.y:986: | T_INCLUDE_ONCE expr { zend_do_include_or_eval(ZEND_INCLUDE_ONCE, &$$, &$2 TSRMLS_CC); }
在985行附近,有这样一群代码:
internal_functions_in_yacc:
T_ISSET ‘(‘ isset_variables ‘)' { $$ = $3; }
| T_EMPTY ‘(‘ variable ‘)' { zend_do_isset_or_isempty(ZEND_ISEMPTY, &$$, &$3 TSRMLS_CC); }
| T_INCLUDE expr { zend_do_include_or_eval(ZEND_INCLUDE, &$$, &$2 TSRMLS_CC); }
| T_INCLUDE_ONCE expr { zend_do_include_or_eval(ZEND_INCLUDE_ONCE, &$$, &$2 TSRMLS_CC); }
| T_EVAL ‘(‘ expr ‘)' { zend_do_include_or_eval(ZEND_EVAL, &$$, &$3 TSRMLS_CC); }
| T_REQUIRE expr { zend_do_include_or_eval(ZEND_REQUIRE, &$$, &$2 TSRMLS_CC); }
| T_REQUIRE_ONCE expr { zend_do_include_or_eval(ZEND_REQUIRE_ONCE, &$$, &$2 TSRMLS_CC); }
;
于是乎,我们需要继续深入寻找zend_do_include_or_eval,
cc@cc-laptop:/opt/workspace/php-src-5.3$ find . -type f -name “*.c” -exec grep -Hn “zend_do_include_or_eval” {} \;
./Zend/zend_compile.c:4317:void zend_do_include_or_eval(int type, znode *result, const znode *op1 TSRMLS_DC) /* {{{ */
zend_do_include_or_eval中组装了一个结构体,ZEND_INCLUDE_OR_EVAL。
再在zend_vm_def.h中找到ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY):
switch (Z_LVAL(opline->op2.u.constant)) {代码略}
中间关键的一句是:
new_op_array = compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);
在zend_complie.h文件中:
ZEND_API zend_op_array *compile_filename(int type, zval *filename TSRMLS_DC);
这个函数定义在zend_language_scaner.l文件中,找出最核心的代码:
if (open_file_for_scanning(file_handle TSRMLS_CC)==FAILURE) {
// require与include的差别:错误信息的显示级别(有lout和无lout)
if (type==ZEND_REQUIRE) { //require时
zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename TSRMLS_CC);
zend_lout();
} else {
zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename TSRMLS_CC);
}
compilation_successful=0;
} else {代码略}
继续追踪zend_message_dispatcher可以在main/main.c文件中找到php_message_handler_for_zend函数:
//include输出错误信息时的级别为:E_WARNING
case ZMSG_FAILED_INCLUDE_FOPEN:
php_error_docref(“function.include” TSRMLS_CC, E_WARNING, “Failed opening ‘%s' for inclusion (include_path='%s')”, php_strip_url_passwd((char *) data), STR_PRINT(PG(include_path)));
break;
//require输出错误信息时的级别为:E_COMPILE_ERROR
代码略
总结
和开头PHP手册所说完全一致,require和include的区别在于,出现错误时,一个是error一个是warning。

2. php函数如何返回数组啊, 比如,

function x(){
$a[0]='a';
$a[1]='b';
$a[2]='c';

$b[0]='123';
$b[1]='456';
$b[2]='789';
return array($a,$b);
}

3. PHP include和require区别

require函数是指包含进来的内容被当成当前文件的一个组成部分,所以当包含进来的文件有语法错误或者文件不存在的时候,那当前文件的PHP脚本都不再执行。

include()函数相当于指定这个文件的路径,当被包含的文件有错时,不会影响到本身的程序运行。
以上不为手打 出处为 http://www.jb51.net/article/15681.htm
我个人实验了下 觉得两者应该只是对错误处理方式不同。

4. PHP中include和required区别是什么

require()语句的功能与include()相类似,都是包括并运行指定文件。不同之处在于:对include()语句来说,在执行文件时每次都要进行读取和评估;而对于require()来说,文件只处理一次(实际上,文件内容替换require()语句)。这就意味着如果可能执行多次的代码,则使用require()效率比较高。另外一方面,如果每次执行代码时是读取不同的文件,或者有通过一组文件迭代的循环,就使用include()语句。

详细区别:

区别一、

include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。

require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。

区别二、

用法上却有一些不同,include()是有条件包含函数,而require()则是无条件包含函数。例如

if($something){
require'somefile.php';
}

这段代码中不论$something取何值,somefile.php都会被包含近文件,而如果使用include,则只有$something为真的时候才会包含文件somefile.php。

区别三、

include()执行时需要引用的文件每次都要进行读取和评估,require()执行时需要引用的文件只处理一次(实际上执行时需要引用的文件内容替换了require()语句)可以看出若有包含这些指令之一的代码和可能执行多次的代码,则使用require()效率比较高,若每次执行代码时相读取不同的文件或者有通过一组文件叠代的循环,就使用include(),可以给想要包括的文件名设置变量,当参数为 include()时使用这个变量。

5. require和include的区别

nclude与require的区别
PHP中的require,require_once,include,include_once的区别
“include”与“required”的作用都是相同的,唯一不同的是PHP在遇到“include”命令时,它就必须重新解释一次。如果在同一个PHP网页中出现10次“include”命令时,它便会被重新解释10次。不过当PHP遇到“require”命令时,不管它在同一个PHP网页中出现过几次,PHP只会解释一次而已。
“require”的工作方式是为了让PHP程序得到更高的效率,所以当它在同一个PHP网页中解释过一次后,第二次出现便不会再解释,这是它的优点。不过严格来说,这也是它的唯一 的缺点,因为它不会重复解释引入的文件,所以当PHP网页中使用循环或条件语句来引入文件时,“require”则不会做任何的改变。当有类似这样的情形时,就必须使用“include”命令来引入 文件了。
当PHP遇到一个利用“include”方式引入的文件,它就会解释一次;遇到第二次时,PHP还是会重新解释一次。与“require”相比,“include”的执行效率则会下降许多;而且当引入文件中包含了用户自定义的函数时,PHP在解释的过程中会发生函数重复定义的问题。不过“include”也不是没有优点的,因为在PHP网页中,它会每遇到一次“include”命令就会重复解释一次,所以非常适合使用在循环或条件判断的语句里。
“include_once()”函数和“require_once()” 函数功能完全相同,会先检查目标档案的内容是不是在之前就已经导入过了,如果是的话,便不会再次重复导入同样的内容。
现在来说include和require的区别:
require()函数包含进来的内容被当成当前文件的一个组成部分,所以当包含进来的文件有语法错误或者文件不存在的时候,那当前文件的PHP脚本都不再执行. include()函数相当于指定这个文件的路径,当被包含的文件有错时,不会影响到本身的程序运行.
include函数可以进行判断是否包含,而require则是不管任何情况都包含进来.所以这点值得注意!
建议大家在包含动态文件,也就是有变量,函数,已经类的时候用include.不过前段时间有人在分析两个函数的执行效率.这个我没自己测试过,等亲自测试了再进行补充

www.w3school.com
通过 include() 或 require() 函数,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。除了它们处理错误的方式不同之外,这两个函数在其他方面都是相同的。include() 函数会生成一个警告(但是脚本会继续执行),而 require() 函数会生成一个致命错误(fatal error)(在错误发生后脚本会停止执行)。
详细介绍
于PHP具有快速、可靠、跨平台应用、源代码开放等特点,使得PHP成为最受欢迎的服务器端Script语言之一。我根据自己在工作中体会到的,向大家介绍PHP使用的心得,希望对大家有所帮助。
利用PHP的Include files维护你的网站
不管你所开发的网站的规模是大是小,你都应该要认识到重复使用程序代码的重要性,不论你重复使用的是 PHP 程序或者是 HTML 原始码。举个例子来说,网站页尾的版权宣告至少每年都得修改一次,如果你的网站有许多个页面,该怎么办呢?动手一个一个修改这些页面肯定是一件头痛的事 情。通过 PHP 我们可以用几个不同的方式来重复使用程序代码。要使用哪些函数端视你要重复使用的是怎样的内容而定。
这些主要的函数包括:
* include() 与 include_once()
* require() 与 require_once()
1.include() 函数会将指定的档案读入并且执行里面的程序。
例如:include('/home/me/myfile');
被导入的档案中的程序代码都会被执行,而且这些程序在执行的时候会拥有和源文件中呼叫到 include() 函数的位置相同的变量范围(variable scope)。你可以导入同一个服务器中的静态档案,甚至可以通过合并使用 include() 与 fopen() 函数来导入其它服务器上面的档案。
2.include_once()函数的作用和 include() 是几乎相同的
唯一的差别在于 include_once() 函数会先检查要导入的档案是不是已经在该程序中的其它地方被导入过了,如果有的话就不会再次重复导入该档案(这项功能有时候是很重要的,比方说要导入的档 案里面宣告了一些你自行定义好的函数,那么如果在同一个程序重复导入这个档案,在第二次导入的时候便会发生错误讯息,因为 PHP 不允许相同名称的函数被重复宣告第二次)。
3.require()函数会将目标档案的内容读入,并且把自己本身代换成这些读入的内容。
这个读入并且代换的动作是在 PHP 引擎编译你的程序代码的时候发生的,而不是发生在 PHP 引擎开始执行编译好的程序代码的时候(PHP 3.0 引擎的工作方式是编译一行执行一行,但是到了 PHP 4.0 就有所改变了,PHP 4.0 是先把整个程序代码全部编译完成后,再将这些编译好的程序代码一次执行完毕,在编译的过程中不会执行任何程序代码)。require() 通常来导入静态的内容,而 include() 则适合用来导入动态的程序代码。
4.如同 include_once()函数,require_once() 函数会先检查目标档案的内容是不是在之前就已经导入过了,如果是的话,便不会再次重复导入同样的内容。
我个人习惯使用 require() 函数来导入版权宣告(rights),静态文字或其它本身不含有变量,
或者本身需要倚赖其它执行过的程序才能正确执行的程序代码。例如:
<HTML>
<HEAD><TITLE>网页标题</TITLE></HEAD> <BODY> [一堆内容] <?
// 导入版权宣告文字
require('/home/me/myright'); ?>
</BODY></HTML>
另一方面,我通常在程序的开头使用 include() 函数来导入一些函式库或者类似的程序代码: <?
// 导入我的函式库
include('/home/me/myfunctions');
// 利用之前导入的函式库里面定义好的 PHP 函数执行一些功能?> <HTML>
<HEAD><TITLE>网页标题</TITLE></HEAD> <BODY> [一堆内容] </BODY> </HTML>
接下来你可能会问这第一个挺符合逻辑的问题:“这些被导入的档案要放在哪儿呢?”简短的答案是:“放在服务器档案系统里的任何地方都行。”然而,要留意的 是如果被导入的档案除了单纯的程序代码片段以外还包含了一些敏感资料,例如连结数据库系统要用到的帐号和密码,那么建议你不要把这些档案放在 Web 服务器的文件根目录之下,因为那样的话他人便可以很容易地窃取到这些资料了。
你可以将这些被包含的档案放在系统的任何一个目录里面,唯一的条件是 PHP 本身用来执行的身分(www,nobody 或者其它身分)必须要有足够的权限能够读取这些档案就可以了。这些档案的扩展名也可以任意取,甚至没有附档名也无所谓。
善用include()和 require()来将网站里面经常需要变动的共享内容做合理的分割,在更新网站内容的时候将会容易进行得多。
利用PHP来维护档案系统
PHP 提供了很多与档案系统相关的函数,让我们不仅可以开启档案,还能够显示目录的内容,搬移档案的位置以及其它更多功能。有的朋友甚至写了能够通过浏览器来管理档案内容的 PHP 程序。
在开始介绍 PHP 的档案系统相关功能之前,我们要先理清一件事情:在 Windows操作系统里
面,档案路径可以使用斜线(/)或者反斜线(\)来表示,但是在其它操作系统里面我们只会使用到斜线。为了保持统一性,下面的例 子里面的档案路径都是使用斜线。
下面的例子程序我将教大家基本的目录内容显示功能,每个步骤都有批注,请直接阅读。
<? /* $dir_name 这个变量的值是你想要读取的目录的完整路径 */ $dir_name = "/home/me/";
/* opendir()函数会开启某个目录,并且传回一个参考值(handle)让我们可以用来在程序中参照到该目录 */
$dir = opendir($dir_name);
/* 开始建立一个字符串,这个字符串包含了 HTML 的列表卷标,用来显示目录中的文件名称。 */
$file_list = "<ul>";
/* 使用一个 while 循环叙述将前面开启的目录中的档案全部读取一遍。如果读取到的档名不是“.”或者“..”,就把该档名写入前面提到的字符串里面去。 */ while ($file_name = readdir($dir)) {
if (($file_name != ".") && ($file_name != "..")) { $file_list .= "<li>$file_name"; } }
/* 替 HTML 列表卷标加上结尾 */ $file_list .= "</ul>";
/* 关闭之前开启的目录并且结束这段 PHP 程序 */ closedir($dir); ?>
<!-- HTML原始码从这里开始 --> <HTML> <HEAD>
</HEAD> <BODY>
<!-- 使用 PHP 程序来将我们所读取的目录名称显示在页面上 --> <P>Files in: <? echo "$dir_name"; ?></p>
<!-- 使用 PHP 程序将该目录中读取到的文件名显示在页面上 --> <? echo "$file_list"; ?> </BODY> </HTML>
经过上面几步,你已经成功把某个目录中的文件名称显示在网页上了。但你要记住一点:要读取某个目录或者档案(读取档案内容的做法稍后会介绍),PHP 本身执行所用的身分必须至少拥有该目录或者档案的读取权限才行,否则系统会显示权限不足的错误讯息。
下一个例子我将教大家如何复制一个档案:
<? /* 变量$orginal储存源文件的完整路径,变量$copied储存复制过去的新档案的完整路径 */ $original = "/home/me/mydatabasemp"; $copied = "/archive/mydatabasemo_1010";
/* 呼叫 () 函数把档案从原始位置复制一份到新的位置去。如果无法复制,那么便终止程序的执行并且显示错误讯息。 */
@($original, $copied) or die("无法复制档案。"); ?>
上面的例子程序可以用来扩充成为一个档案备份系统程序。当这个程序执行的时候,它会将数据库的数据文件复制到其它目录下面做为备份之用。只要修改系统的排 程档案内容(crontab),我们便可以让这个程序自动在每天的固定时间执行一次,达到系统自动备份,不需要人工手动执行。
如果你的系统上面有安装 Lynx 软件(Lynx 是一种纯文字的 Web 浏览器)的话,你可以在系统排程档案里面加入下面这笔记录来让系统在固定时间自动激活 Lynx 并且呼叫我们之前写好的 PHP 备份程序。当 Lynx 呼叫(浏览)我们的 PHP 程序的时候,该程序就会被执行,并且产生备份文件。下面这个例子教你如何在每天早晨五点钟执行我们的备份程序,并且在执行完以后自动将 Lynx 程序关闭:

来自:闫志飞166 > 《php》

上一篇:php 导出excel (html)
下一篇:Windows版本Apache+php的Xhprof应用——1

转藏到我的图书馆

献花(0)

分享到微信

分享:

类似文章
更多
PHP之PHP文件引用详解
比较require(),include(),require_once(...
php header函数使用要点
include 和 include_once 有什么分别?r...
十天学会PHP/第六天:PHP日期、引用
PHP中file_exists与is_file,is_dir的区别....
php 删除目录下N分钟前创建的所有文件
过滤危险html代码的php自定义函数

热门推广

猜你喜欢

最美雪景欣赏——你那里下雪了吗?

广告营销如千军万马过独木桥 成功质...

思乡最是诗行,给漂泊的游子

为了不得癌症,今天就要做

初恋的地方

36种吃得起的抗衰老食物

世界十大神秘"鬼船"有什么神秘故事

公共基础知识4000题

老师常用教学网站账号密码大集合

没有扫描仪,怎么办?用什么代替?

发表评论:
您好,请 登录 或者 注册 后再进行评论
其它帐号登录:

最新文章
深入理解php底层:php生命周期
通过virtualbox最小化安装centos 6.3...
debian下控制台和VI彩色显示&ssh
Ubuntu下使用SVN
sources镜像:sources.list.wheezy.de...
nginx.conf 配置lnmp
更多

热门文章
没见过60种花卷的做法吧&别错过学习的...
“中国式xx”让全世界哭笑不得
小学英语辅导全套视频教程【珍藏版】
我 家 宝 贝 女 儿[5]
【从“小一“至“高三“各年级对孩子...
灌汤包的皮怎么做又薄又透,能当气球吹
蜂蜜加肉桂 ---- 令人叹为观止的神奇
德国制造和中国制造究竟不同在哪
女人的苦处:写的非常好——
外媒一则漫画揭示中美博弈(很喜感)
白酒鲜姜云南白药粉治秃顶脱发效果神奇
人要长生,肠要常清
更多>>

关闭

关闭

热点内容
idlj编译idl文件 发布:2025-07-18 02:14:47 浏览:351
国外代理服务器ip地址和端口 发布:2025-07-18 02:12:44 浏览:719
将个人电脑改云桌面服务器 发布:2025-07-18 02:12:31 浏览:758
加密机进程 发布:2025-07-18 02:08:34 浏览:241
光遇源码 发布:2025-07-18 01:36:52 浏览:609
一克拉算法 发布:2025-07-18 01:36:16 浏览:881
sql的标准 发布:2025-07-18 01:31:19 浏览:418
za解压怎么用 发布:2025-07-18 01:15:43 浏览:39
勒索加密文件恢复 发布:2025-07-18 01:15:37 浏览:159
更换云服务器厂商需要迁移域名 发布:2025-07-18 01:14:54 浏览:906