文件加载
综述:
有4个文件加载的语法形式:
include,include_once,require,require_once
他们的本质是一样的,都是用于加载/引入/包含/载入一个外部文件到当前php代码中来
他们只在2个方面有细微的区别:
1.如果文件加载失败,有不同的处理规则。include和require的区别
2.如果文件加载重复,择优不同的处理规则。xxx和xxx_once不同
3.他们都是语法结构,而非函数,使用形式可以有两种:
3.1include “文件路径”
3.2include (”文件路径“)
文件路径问题:
不管是哪个载入语法,都涉及到文件路径问题。主要有3种情况:
1.相对路径:./../
就是以./../ 开头的路径。
./表示当前网页文件所在的位置
../表示当前所在网页文件所在位置的上一级位置(文件夹,目录)
这种相对位置对一个网站中的所有内容(包括php,html,)等都有作用。
<?php
include '../day4/sleep.php'; ?>
2.绝对路径:c:/abc/def
有两种绝对路径
1.本地绝对路径:
window系统:c://d1/d2/page3.php
unix系统:/d1/d2/page3.php
2.绝对网络路径:
http://www.abc.com/d1/d2/page4.php
3.只有文件名(无路径)
在php的include语法中,如果只给出文件名,而没有给出路径,则此时尤其内部找文件 的规则。
1.首先在系统设置的include目录下查找。
在php.ini中,有include_path设定:
;UNIX: "/path1:/path2"
;include_path= ".;/php/includes"
;
;Windows: "\path1;\path2"
;include_path= ".;c:\php\includes"
其设定可以设定多个目录,使用;进行分隔开,系统按照顺序依次查找文件。
我们也可以在脚本中进行设置:
//设置配置文件夹中的include_path值-代码中的设定只对当前 //代码有效
//而且这样的设定,无需重启apache set_include_path('/var/www/html/day4'); include 'sleep.php';//使用一个无路径的载入,该sleep.php //实际是day4中的一个文件
更加常见的一种做法:
//更常见的做法 $path = get_include_path();//获得系统的 //include_path $path_new = $path.PATH_SEPARATOR."/var/www/html/dvwa"; //PATH_SEPARATOR:是系统常量,代表目录分割符: // unix 系统中, 是":" // window系统中: 是“;” set_include_path($path_new); include "about.php";
2.上面没找到,在当前执行的网页文件所在目录查找(所谓当前工作目录)。
所谓当前网页文件,就是地址栏中显示的那个文件名
3.上面还没找到,则在当前include命令所在文件的所在目录中进行查找。
例如:includepage1.php
例如:当前工作目录是/opt/www/html
一个page1.php在当前目录下/opt/www/html/page1.php
另一个在当前目录下的一个文件夹下。/opt/www/html/sss/page1.html则 优先第一个。
文件载入过程
从include语句处退出php脚本模式(进入html代码模式)
载入include语句所设定的文件中的代码并且执行(如同在文件夹中一样)
退出html模式重新进入php脚本模式,继续之后的代码
举例:
include_yuanli.php
<?php echo "<p>先前的代码</p>"; include './page3.php'; echo "<p>代码(2)</p>"; ?>
page3.php
page3前面 <?php echo "<br/>这是page3的echo输出"; ?> page3后面 相当于: <?php echo “<p>先前的代码</p>”;?> page3前面 <?php echo "<br/>这是page3的echo输出"; ?> page3后面 <?php echo “<p>代码</p>” ?> 几个区别: include_once 和include的区别:前者能够保证不会被重复加载。 Requie 和 include 的区别: 引用失败时,include警告并且继续执行后续代码, require终止。 require_once 和require的区别:前者保证不会被重复载入。 Return 关键字 以前我们只在函数中出现return关键字,其作用是:结束函数,并可以返回数据 return // 单纯结束 retuen $x ; //结束,并且返回数据$x; 那么: 被包含的(载入)的文件中return关键字也具有同样的作用。 include_return.php <?php echo "<p>第一行</p>"; include "page4.php"; echo "<p>第二行</p>"; ?> page4.php <?php echo "page4中第一行<br/>"; echo "page4中第二行<br/>"; return; echo "page4中第三行<br/>"; ?> 输出结果: 第一行
page4中第一行
page4中第二行
第二行//仍然存在,证明include中的return不会影响include_return.php
错误处理
错误代码的分类:
语法错误:
程序无法运行,直接提示语法错误
逻辑错误:
程序从头到尾都没有发生提示错误,但程序运行计算的结果是错误的
错误的分级
在平衡盘中,将各种错误根据不同的严重程度和产生的来源分为几个级别:
每一个界别的错误,对对应着相应的系统常量。
系统错误:
E_ERROR:系统严重错误
一发生,系统立即停止执行。
E_WARNING:系统警告
一发生,提示错误并且继续执行。
通常该错误希望能够在”下一个工作日“去处理和解决。
E_NOTICE:系统提示
一发生,提示错误,而且代码完全并继续执行。
E_PARSE:语法错误:
一发生,停止执行。
他们的本质是什么呢?
echo"<br/>ERROR=".E_ERROR;
echo "<br/>E_WARNING=".E_WARNING; echo "<br/>E_PARSE=".E_PARSE; echo "<br/>E_NOTICE=".E_NOTICE;
输出结果:
ERROR=1
E_WARNING=2
E_PARSE=4
E_NOTICE=8
可见他们只是一些系统变量。
用户自定义错误:
只有3个:
E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE
我们可以在程序中,自己创建生成错误。
其他:
E_ALL代表所有的错误
E_STRICT代表严格性
错误的触发:
程序确实发生了运行时错误,也可能是语法检查错误。
3种常见的运行时错误:
//三种常见的运行时错误
echo "<h1>3种常见的运行时错误"; echo "$var1";//使用不存在的变量 echo "<br/>正确代码1"; include "no-file.php";//包含不存在的文件 echo "<br/>正确代码2"; $m = func1();//调用不存在的函数 错误代码:
Undefinedvariable: var1 in /var/www/html/day5/error_1.php on line 15
include(no-file.php):failed to open stream: 没有那个文件或目录
Fatalerror: Uncaught Error: Call to undefined function func1() in
人工触发:
程序员通过程序代码而产生一个错误。
语法:
trigger_error(“错误提示”)
//三种常见的运行时错误
trigger_error('用户提示性错误1', E_USER_NOTICE); trigger_error('用户提示性错误2', E_USER_WARNING); trigger_error('用户提示性错误1', E_USER_ERROR); echo "<h1>3种常见的系统错误"; echo "$var1";//使用不存在的变量 notice echo "<br/>正确代码1"; include "no-file.php";//包含不存在的文件 warning echo "<br/>正确代码2"; $m = func1();//调用不存在的函数 echo "<h3>3种常见的用户错误</h3>";
错误的显示控制:
网页中显示(提示)错误信息,是可以进行控制的,有两种途径:
1.在php。ini文件中设定,对所有的php文件都有效
2.在当前脚本文件中,只对当前脚本文件有效。
错误的显示有两个方面可以进行控制:
1.设定是否显示:display_error:
php.ini中,display_error=on;//表示显示,off表示不显示
display_errors=On
脚本中:ini_set(‘display_eroor’,1’)// 1表示显示,0表示不显示
2.设定显示哪些级别的错误--当第一项设置为显示的情况下
php.ini文件中:
error_reporting= E_NOTICE //只显示E_NOTICE错误
error_reporting= E_NOTICE | E_WARNING ;/ /显示E_NOTICE和 //E_NOTEING的错误
error-reporting= E_NOTICE | E_WARNING | E_USER_ERROR
解释上一行:
E_NOTICE:00000000 00001000
E_WARNING:00000000 00000010
E_USER_ERROR:00000001 0000000
或运算:
0000000100001010
实际上,在开发阶段,通常使用的是:
error_reporting = E_ALL | E_STRICT
系统默认设置是:error_reporting=E_ALL& ~E_DEPRECATED & ~E_STRICT
他是这样的结果:
E_ALL 01110111 11111111
E_STRICT 00001000 0000000
或运算:
可见,E_ALL并非表示所有,只有E_ALL和E_STRICT一起 表示所有。如果想在显示所有错误中关闭某个特定的错误:
error-reporting= E_ALL | E_STRICT & ~E_NOTICE (关闭了 E_NOTICE的错误)
3.在代码中设定
ini_set(‘error_reporting’,E_NOTICE);
ini_set(‘error_reportign’,E_NOTICE | E_WARNING);
ini.set()函数几乎可以设定所有php.ini中的设定项目:
形式如下:
ini_set(‘设定名称名’,值);//这种设定只有对当前脚本有效,无需重启apache,很方便。
记录错误日志:
在开发阶段,通常都是显示所有的错误。意图解决错误。
在产品阶段,我们通常都是隐藏所有的错误—并且同时将错误信息记录到文件中--错误日志
我们可以自己查看错误日志已解决开发阶段没有发现的错误问题。
记录错误日志同样有两种途径:
1.在php.ini文件中设定。
log_errors=On;//用于设定是否记录错误日志,on记录,off不记录。
error_log="/opt/lampp/logs/php_error_log";//错误日志文件名
如果没有给定路径,则系统会在每一个文件夹下面建立文件并记录错误。
2.在当前脚本中设置。
ini_set(‘log_errors’,On);
ini_Set(‘error_log’,‘err1.log’)
ini_set(‘error_log’,‘err2.txt’)
ini_set(‘error_log’,‘err3.html’)
自定义错误处理:
自定义错误处理可以让我们自己完全控制错误的输出内容
1.设定要用来处理错误的函数名:set_error_handler(‘函数名’)
2.自己去定义该函数,并在其中进行任何错误信息的输出。
设置好后,发生错误,系统就会调用该函数里面设置的代码。
set_error_handler('myError');//该函数不需要特别去调用,只有一发生错误,就会 自动调用。
// 设定错误发生时执行我们定义的函数:set_error_handler //定义该函数,有四个参数: function errorHandler //$errNo 错误号 就是错误级别的变量 //$errMsg 错误提示信息 //$errFile 错误所在文件名 //$errLIne 错误所在行 function myError($errNo, $errMsg, $errFile, $errLine){ echo "大事不好了,文件($errFile)的第($errLine)行发生错误"; echo "错误号为:$errNo, 错误提示信息为:$errMsg"; } //这里发生错误 echo "$v1"; //触发一个自定义的错误: trigger_error("年龄输入信息有无,请重新输入", E_USER_ERROR); 但是如果发生的是关键的错误,将会调用默认的函数。