第五天 文件路径加载 错误处理

来源:互联网 发布:国际地图导航软件 编辑:程序博客网 时间:2024/06/06 17:08

文件加载


综述:

4个文件加载的语法形式:

includeinclude_once,require,require_once

他们的本质是一样的,都是用于加载/引入/包含/载入一个外部文件到当前php代码中来

他们只在2个方面有细微的区别:

1.如果文件加载失败,有不同的处理规则。includerequire的区别

2.如果文件加载重复,择优不同的处理规则。xxxxxx_once不同

3.他们都是语法结构,而非函数,使用形式可以有两种:

3.1include “文件路径”

3.2include(”文件路径“)


文件路径问题:

不管是哪个载入语法,都涉及到文件路径问题。主要有3种情况:

1.相对路径:./../

就是以./../开头的路径。

./表示当前网页文件所在的位置

../表示当前所在网页文件所在位置的上一级位置(文件夹,目录)

这种相对位置对一个网站中的所有内容(包括phphtml,)等都有作用。

<?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.只有文件名(无路径)

phpinclude语法中,如果只给出文件名,而没有给出路径,则此时尤其内部找文件的规则。

1.首先在系统设置的include目录下查找。

php.ini中,有include_path设定:

;UNIX: "/path1:/path2"

;include_path= "./php/includes"

;

;Windows: "\path1;\path2"

;include_path= ".;c:\php\includes"

其设定可以设定多个目录,使用;进行分隔开,系统按照顺序依次查找文件。

我们也可以在脚本中进行设置:

//设置配置文件夹中的include_path-代码中的设定只对当前 //代码有效

//而且这样的设定,无需重启apacheset_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

<?phpecho "<p>先前的代码</p>";include './page3.php';echo "<p>代码(2</p>";?>

page3.php


page3前面<?phpecho "<br/>这是page3echo输出";?>page3后面相当于:<?phpecho “<p>先前的代码</p>”;>page3前面<?phpecho "<br/>这是page3echo输出";?>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<?phpecho "<p>第一行</p>";include "page4.php";echo "<p>第二行</p>";?>page4.php <?phpecho "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 line15

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";//使用不存在的变量 noticeecho "<br/>正确代码1";include "no-file.php";//包含不存在的文件 warningecho "<br/>正确代码2";$m = func1();//调用不存在的函数echo "<h3>3种常见的用户错误</h3>"; 



错误的显示控制:

网页中显示(提示)错误信息,是可以进行控制的,有两种途径:

1.phpini文件中设定,对所有的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_NOTICE00000000 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_ALLE_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);但是如果发生的是关键的错误,将会调用默认的函数。


原创粉丝点击