zoukankan      html  css  js  c++  java
  • PHP专题——重点函数_静态化_缓存_面向对象_异常处理

    http://www.cnblogs.com/wangmingshuai/archive/2012/07/27/2611246.html

    PHP专题——重点函数_静态化_缓存_面向对象_异常处理

     

    PHP专题

        

    1. 1.            选择的理由
    1. 2.        重要函数
    1. 3.        面向对象
    1. 4.        异常处理
    1. 5.         静态化
    1. 6.         缓存与Smarty

    作者:邝伟林

                                          

                                                                          梧桐网络工作室

    选择PHP是有理由的:

    这一章里将覆盖一下几点内容: 第一:选取优秀的释义来说明 PHP是什么; 第二:归纳出PHP卓越的特点; 第三:显示PHP被使用的状况; 第四:提供一种学习PHP的流程; 第五:前瞻这个专题讲解的逻辑。
    PHP是什么?     对于php程序员来说,应该非常了解php是什么了,不过也有很不少人所知甚少,要不,你看很多人在问PHP怎么打开,PHP要用什么播放器打开之类的提问。当然一个好的释义对于我们了解它的本质是很有帮助的。     PHP:Hypertext Preprocessor 超级文本预处理语言(起初只是Personal Home Page ,个人主页).PHP 是一种 HTML 内嵌式的语言,PHP与微软的ASP颇有几分相似,都是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,现在被很多的网站编程人员广泛的运用。PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。它可以比 CGI 或者 Perl 更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;与同样是嵌入HTML文档的脚本语言JavaScript相比,PHP在服务器端执行,充分利用了服务器的性能;PHP执行引擎还会将用户经常访问的PHP程序驻留在内存中,其他用户再一次访问这个程序时就不需要重新编译程序了,只要直接执行内存中的代码就可以了,这也是PHP高效率的体现之一。PHP具有非常强大的功能,所有的CGI或者JavaScript的功能PHP都能实现,而且支持几乎所有流行的数据库以及操作系统。(摘自百度百科,非常优秀的释义。)     从释义中我们可以归纳出几点PHP卓越的特点: PHP卓越的优势: 第一:PHP具有跨平台的特性,可以在多种操作系统下运行;PHP能在多种服务器平台上运行,而与之相比,ASP,JSP等则只能在单一的服务器平台上运行。 第二:PHP是一种服务器端脚本语言,是动态网页脚本语言的一种,而且必须在服务器端运行。 第三:PHP 是一种 HTML 内嵌式的语言,它可以很简单地嵌入到普通的HTML页中,用户要做的的只是在普通HTML页中加入PHP代码即可,学习起来并不困难。 第四:PHP通常与MySQL配合使用,但它同时也支持流行的几乎所有的数据库系统,而其它网页脚本语言则没有这种特性。 第五:PHP是一个开源的程序,所有的PHP源代码事实上都可以得到,并且是免费的。 第六:效率高,PHP消耗相当少的系统资源。 第七:在php4,php5 中,面向对象方面都有了很大的改进,现在php完全可以用来开发大型商业程序。
    当今PHP使用的状况:      据PHPChina提供的统计数据显示:后缀形式分类的网页情况来看,PHP现在排名第一:占24.4%,其次是Html是19.4%;Asp 仅仅是14.3%,Aspx 则为4.7%. PHP起步相对较晚,1994年Rasmus Lerdorf创建,刚刚开始只是一个简单的用Perl语言编写的程序,用来统计他自己网站的访问者,有如今迅猛的发展强劲,不能不归功于PHP这些卓越的特点。
    我建议的学习PHP的流程(前提是对静态网页编写以及网站的常规知识已有了确切把握): (一) 明确学习的目的,通过接触PHP培养浓厚的兴趣和求知欲; (二)搭建PHP运行环境(可以使用PHP+MySQL+Apache安装包,这样搭建一个工作环境很简捷); (三)足够的学习资料,包括书本,网页教材,视频教材,专业性网站,论坛,QQ群,电子书,博客等; (四)勤动手,亲自实现一个又一个小程序并擅于总结; (五) 从简单的语法到系列函数,数组,安全事务等; (六) 使用数据库; (七)学习面向对象编程; (八)PHP静态化与缓存技术; (九)使用模板; (十) 实现Ajax. 另外:坚定一个目标,千万别这会学这过会学那;学无止境,要做得更好;努力固然重要,但有时选择比努力更加重要,特别是IT行业,技术一日千里,要擅于随时发现新技术。
    专题前瞻: 在这个专题里,我把重心放在讲解PHP的重要环节上。 首先是函数,这章里我不会进行简单的罗列,也不可能系统讲解,而是抽取重要的,或常用到的,或不经常使用到但非常有用的函数进行别致的分析。 面向对象这一章以一个独到的实例尽量把有关面向对象编程的重要概念引用进去,深刻了解OOP机制。 异常处理与静态化两章主要是讲解必要性以及具体怎么实现。 Smarty这一章介绍模块的使用,以及如何实现PHP的缓存技术。
    祝大家有个快乐与获益的旅程 !

    非常有用的常见函数或非常见函数

           PHP内置了大量的函数,非常熟练地掌握越多的函数,编程起来也就会更有效率。        这些函数囊括了字符(串)类,数组类,数据库类,文件目录类,图像处理类,网络通信类,服务器类,Win32类等等。下面对一些重要的函数进行归纳,分析和应用。 (一)字符文本类(String)。        试想,我们对String都会有哪些操作呢?我把它大致总结成以下几种情况:(1)特殊字符的转义转换;(2)查找统计;(3)插入,更换,删除,格式化,再分配。下面我以表格的形式选取fatalFun(至关重要的函数)进行讲解。(正则表达式可以独立成章在此暂时不讲。) ★★特殊字符转义转换★★

    函数原型

    功能分析

    使用实例

    addslashes($str)

    使用反斜杠(\)转义单双引号(注意先使用magic_quotes_gpc函数判断是否已启动自动转义)

    addslashes($_POST["uname"])

    htmlentities($str)

    转换字符为HTML编码,即HTML标签不再起作用被原貌输出

    htmlentities("<b>不会粗体</b>")

    nl2br($str)

    将换行字符转成<br>

    nl2br("断\n开")

    stripslashes($str)

    清除反斜杠

    stripslashes("多余的'\'")

    quotemeta($str)

    对". \ + *"等字符加入反斜杠

    quotemeta("1.2+1=?");

    ★★查找统计★★

    函数原型

    功能分析

    使用实例

    substr($str,$start[,$len])

    从$start起取[取$len个],$start为负则从尾(-1,正时为0)起,$len为负意为取到倒数第几

    substr("hello world   !",2,-5)→"llo wor"

    strchr($str,$char)

    取出从首次出现$char后的字符串(区分大小写);php5中的stristr功能与此同,但不区分大小写<

    strchr("HEllo world   !","l")→llo world !

    strpos($str,$char)

    $char在文本$str中第一次出现的位置(区分大小写);php5中的stripos功能与此同,但不区分大小写

    strpos("HELlo Wold","l")→3

    strcspn($str,$char[,$start[,$len]])

    char在文本$str中第一次出现的位置(区分大小写);若有$start,$len则表示从哪里开始计数,考虑查多少位。

    strcpn("012345678","5",2,5)→3

    substr_count($str,$char[$start[,$len])

    统计$char在$str出现的次数,若有$start,$len则表示从哪里开始查,考虑查多少位。

    substr_count("hello   world","o",5,1)→0

    ★★插入,替换,删除,格式化,再分配★★

    函数原型

    功能分析

    使用实例

    str_replace($str1,$str2,$str);   strtr($str,$str1,$str2)

    用$str2替换$str中的$str1

    str_replace(">",">",$title)

    substr_replace($str,$char,$start[,$len])

    从$start起用$char替换之后的所有字符,若有$len,则$len长度

    substr_replace("hello   world !","my love",6,5)→hello my love !

    strtolower($str);strtoupper($str);   ucfirst($str);ucwords($str)

    全部小写或大写;   首字母大写或每个单词首字母大写

    ucwords("hello world   !")→Hello World !

    implode($glue,$arr);   join($str,$arr)

    将数组$arr的值用字符$glue连接合并成字符串

    implode("or",array("to   be","not to be"))→"to be or not to be"

    explode($glue,$str[,$num])

    按$str中的标志$glue分割成数组成员,若有则表示数组成员的个数

    explode("@","1@2@3",2)→Array([0]=>1,[1]=>2@3)

    chop($str);ltrim($str);   trim($str);rtrim($str)

    去除连续,左,两端,右空格,制表符,回车

    chop("        he llo    world ")→"he llo   world"

    (二)数组操作类 在PHP编程中,有相当多的内容都与数组有联系,入库的信息需要纳入数组,统计一些信息需要写入数组等,这些操作都离不开数组,很多信息都是用数组作为载体的,所以数组的操作在PHP编程中占有很大的比重,只有熟练地操作数组,才能写出高效的PHP程序。 PHP支持一维数组和多维数组,数组的元素也有很大的灵活性,数组可以有用户创建或由函数生成,有一些特定的数据库处理函数可以从数据库查询中生成数组,还有一些函数的返回值也是数组等。
    下面介绍几种操作数组非常实用的函数

    函数原型

    功能分析

    使用实例

    Bool in_array($str,$arr)

    判断字符$str是否在数组$arr里,在时返回TRUE,否则为FALSE

    if(in_array("love",array("love","like")))→true

    Array array_combine($arr1,$arr2)

    返回以$arr1作键$arr2作值的数组

    array_combine(array("中国","日本"),array("伟大","尾大"))→array(["中国"]=>"伟大",["日本"]=>"尾大")

    Array   array_chunk($arr,$num[,$kpkey])

    将数组$arr以$nme个成员为一组,返回新数组,$kpkey表示是否保留原来的键名.

    array_chunk(array(["中国"]=>"伟大",["日本"]=>"尾大",["美国"]=>"大尾"),2,true)→array([0]=>array(["中国"]=>"伟大",["日本"]=>"尾大"),[1]=>array(["美国"]=>"大尾"))

    Array array_count_values($arr)

    统计数组$arr中值的出现次数,以新数组返回

    array_count_values(array("100","120","100"))→array([100]=>2,[120]=>1);

    msyql_diff($arr1,$arr2)   msyql_diff_key($arr1,$arr2)   msyql_diff_assoc($arr1,$arr2)

    对应的,通过只比较值/之比较/键名/两者都比较来返回只在$arr1不在$arr2的新数组。

    mysql_diff_assoc(array(1,["k"]=>"wl"),array(1,2))→array(["k"]=>"wl")

    msyql_intersect($arr1,$arr2)   msyql_intersect_key($arr1,$arr2)   msyql_intersect_assoc($arr1,$arr2)

    对应的,通过只比较值/之比较/键名/两者都比较来返回同时在$arr1与$arr2的新数组。

    mysql_diff_assoc(array(1,["k"]=>"wl"),array(1,2))→array([0]=>1)

    (三)数据库类 使用PHP少不了对数据库的操作,PHP+MySQL是一对不可多得的"黄金组合",下面就介绍一些操作MySQL数据库的重要函数.

    函数原型

    功能分析

    使用实例

     

    mysql_connect($host,$urer,$psd);   mysql_pcoonent($host,$urer,$psd)

    这两个都是用于连接数据库返回连接标志符,后者为持久连接,即它会先寻找已打开的链接,若找到则返回此连接标识符而不打开新的连接,此连接将保持打开以备后续操作。

    $link=mysql_pconenct("localhost","my","123")  

     

    mysql_close([$link])   mysql_free_result($res)

    关闭连接与释放资源

    mysql_free_result($result)

     

    BOOL mysql_ping($link)

    检查数据库的连接是否正常,若已断开,则自动尝试连接,本函数可用于空闲很就的脚本来检查服务器是否关闭了连接,连接可用则返回TRUE

    if(mysql_ping($link){ echo   "服务器连接还在"})

     

    mysql_error([$link])   mysql_errno([$link])

    返回错误的文本内容或错误的数字代号

    msyql_select_db($db,$link) or   die("错误:",mysql_errno($link))

     

    resourse   mysql_unbuffered_query($sql,[,$link])

    该函数不会自动获取并缓存结果集,可以节省内存,并且获取第一行后立即执行,而不用等到SQL语句全部执行完毕。当使用多个数据库连接时,必须制定$link

    $result=mysql_unbuffled_query($sql)  

     

    int   mysql_affected_rows([$link])

    获取最近一次与指定数据库关联的INSERT,UPDATE或DELETE查询所影响的记录行数。查询成功则返回行数,失败则为-1;注意当删除所有记录时返回0,当使用UPDATE时,MySQL不会将原值与新值一样的列更新,这使得它的返回值不一定就是符合查询条件的记录数。

    mysql_query("delete from   tb where id>12");printf("被删除的记录行数为:d%\n",mysql_affected_rows();)

     

    Array mysql_fetch_row($res)   Array mysql_fetch_assoc($res)   Array mysql_fetch_array($res[,$query_type])   object mysql_fetch_object($res)

    分别表示:从结果集中获取一行返回数字数组,关联数组,数字或关联数组,返回对象。其中$res为查询结果集

    数字数组表以数字作键名的数组,关联数组以字符为键名,返回对象则通过该对象访问数据。

     

    Object mysql_fetch_field($res)

    从结果集中获取列信息,并返回一个包含字段信息的对象,如列名,是否有最大长度设置,是否允许为空,是否为关键字等,是为1,否为0,其它返回相应字符。。

    while($i<mysql_num_fields($res){   $i++;$obj=mysql_fetch_field($res);if($obj){echo   $obj->name.$obj->max_length.$obj->not_null.$obj->primary_key;}})

     

    mysql_num_rows($res)   mysql_num_fields($res)

    返回结果集中的行数或字段数

    主要是用于遍历结果集

     

    (四)变量检查类函数 变量检查类函数,我把它分为这么几种情况:检查变量是否存在,是否有值,数据类型是什么,强制转换,以及打印出变量的详细信息,具体如下表:

    函数原型

    功能分析

    使用实例

    bool isset($var)*   unset($var)

    检查变量是否存在,以及销毁一个变量。

    $var=NULL;if(isset($var){echo   "$var已设置,所以返回为TRUE,你将看到这一段话。";}

    bool empty($var)

    检查变量的值是否为空,包括"",0,"0",NULL,FALSE,array(),var   $var 以及没有任何属性的对象都被认为为空,如果为空,则返回TRUE

    $var=0;if(empty($var)){ echo   "变量为空,看到此句话。";}

    is_numeric*int*float*bool   string*object*null*array*resource   scalar($var)

    检查数据类型,从字面就可以看出都是检查什么,这里不赘述,需要说明的是,如果是那种类型时,函数将返回TRUE.其中is_scaler($var)用于检查是否为标量,标量指的是int,float,string,bool,而array,object,resource则不属于标量。

    $var="123";if(is_numeric($var)){   echo "是数值或数值字符串,所以看得到这句话。";}

    floatval*intval*round*ceil*floor($var)

    分别为浮点数,取整,四舍五入,天花板数,地板数,看看例子就明白了:

    floatval(1.23)→1.23   int(1.23)→1   int(1.51)→1   round(1.23)→1   round(1.51)→2   ceil(1.23)→2   ceil(1.51)→2   floor(1.23)→1   floor(1.51)→1

    print_r($var [,$bool_return])   var_dump($var)   var_export($var [,$bool_return])

    这三个函数都是用于把变量的值详细地打印出.其中 当$bool_return为true时,则可以捕获该函数的返回值,并不会打印结果。

    $var=print_r(array(0,1),true);echo   $var;→array([0]=>0,[1]=>1)

    关于正则表达式,文件目录函数,图像类函数等,我将在下次专题更新时详细讲解,欢迎关注。

    PHP面向对象编程

    此章思路: 首先把面向对象编程,类,对象,类的封装性,继承和多态的概念以深入浅出的方式阐明; 再全面剖析面向对象编程中用到的关键字与内置方法函数; 最后以一个简单的例子说明如何面向对象编程。 1.面向对象的概念 面向对象编程(Object Oriented Programming, OOP)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成,OOP达到了软件工程的三 个目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。面向对象一直是软件开发领域内比较热门的话 题,首先,面向对象符合人类看待事物的一般规律。其次,采用面向对象方法可以使系统各部分各司其职、各尽所能。为编程人员敞开了一扇大门,使其编程的代码 更简洁、更易于维护,并且具有更强的可重用性。有人说PHP不是一个真正的面向对象的语言,这是事实。PHP 是一个混合型语言,你可以使用OOP,也可以使用传统的过程化编程。然而,对于大型项目,你可能需要在PHP 中使用纯的OOP去声明类,而且在你的项目里只用对象和类。这个概念我先不多说了,因为有很多朋友远离面向对象编程的主要原因就是一接触面向对象概念的时 候就理解不上去,所以就不想去学下去了。等读者看完整体内容后再去把概念搞明白吧. 2.什么是类,什么是对象,类和对象这间的关系 类的概念:类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。 对 象的概念:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。从更抽象的角 度来说,对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务 的封装体。客观世界是由对象和对象之间的联系组成的。 类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类。类描述了一组有相同特性(属性)和相同行为(方法)的对象。 上 面大概就是它们的定义吧,也许你是刚接触面向对象的朋友, 不要被概念的东西搞晕了,给你举个例子吧,如果你去中关村想买几台组装的PC机,到了那里你第一步要干什么,是不是装机的工程师和你坐在一起,按你提供的 信息和你一起完成一个装机的配置单呀,这个配置单就可以想象成是类,它就是一张纸,但是它上面记录了你要买的PC机的信息,如果用这个配置单买10台机 器,那么这10台机子,都是按这个配置单组成的,所以说这10台机子是一个类型的,也可以说是一类的。那么什么是对象呢,类的实例化结果就是对象,用这个 配置单配置出来(实例化出来)的机子就是对象,是我们可以操作的实体,10台机子,10个对象。每台机子都是独立的,只能说明他们是同一类的,对其中一个 机做任何动作都不会影响其它9台机器,但是我对类修改,也就是在这个配置单上加一个或少一个配件,那么装出来的9个机子都改变了,这是类和对象的关系(类 的实例化结果就是对象)。 3.什么是面向对象编程呢? 先不说他的概念,如果你想建立一个电脑教室,首先要有一个房间,房间里面要有N台电脑,有N张桌子,N把椅子,白板,投影机等等,这些是什么,刚才咱们说了,这就是对象,能看到的一个个的实体,可以说这个电脑教室的单位就是这一个个的实体对象,它们共同 组成了这个电脑教室,那么我们是做程序,这和面向对象有什么关系呢?开发一个系统程序和建一个电脑教室类似,你把每个独立的功能模块抽象成类,形成对象, 由多个对象组成这个系统,这些对象之间都能够接收信息、处理数据和向其它对象发送信息等等相互作用。就构成了面向对象的程序。 4.如何抽象出一个类? 上面已经介绍过了,面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,所以我们首先要做的就是如何来声明类,做出来一个类很容易,只要掌握基 本的程序语法定义规则就可以做的出来,那么难点在那里呢?一个项目要用到多少个类,用多少个对象,在那要定义类,定义一个什么样的类,这个类实例化出多少 个对象,类里面有多少个属性,有多少个方法等等,这就需要读者通过在实际的开发中就实际问题分析设计和总结了。 类的定义: class 类名{ } 使用一个关键字class和后面加上一个你想要的类名以及加上一对大括号, 这样一个类的结构就定义出来了,只要在里面写代码就可以了,但是里面写什么? 能写什么?怎样写才是一个完整的类呢?上面讲过来,使用类是为了让它实例出对象来给我们用,这就要知道你想要的是什么样的对象了,像上面我们讲的一个装机 配置单上写什么,你装出来的机子就有什么。比如说,一个人就 是一个对象,你怎么把一个你看好的人推荐给你们领导呢?当然是越详细越好了: 首先,你会介绍这个人姓名、性别、年龄、身高、体重、电话、家庭住址等等。 然后,你要介绍这个人能做什么,可以开车,会说英语,可以使用电脑等等。 只要你介绍多一点,别人对这个人就多一点了解,这就是我们对一个人的描述, 现在我们总结一下,所有的对象我们用类去描述都是类似的,从上面人的描述可以看到, 做出一个类来,从定义的角度分两部分,第一是从静态上描述,第二是从动态上描述,静态上的描述就是我们所说的 属 性,像上面我们看到的,人的姓名、性别、年龄、身高、体重、电话、家庭住址等等。动态上也就是人的这个对象的功能,比如这个人可以开车,会说英语,可以使 用电脑等等,抽象成程序时,我们把动态的写成函数或者说是方法,函数和方法是一样的。所以,所有类都是从属性和方法这两方面去写,属性又叫做这个类的成员 属性,方法叫做这个类的成员方法。 class 人{ 成员属性:姓名、性别、年龄、身高、体重、电话、家庭住址 成员方法:可以开车, 会说英语, 可以使用电脑 } (五)封装性: 封装性就是把对象的属性和行为结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,有以下两个显著的特点: 1.把对象的全部属性和全部行为结合在一起,形成一个不可分割的独立单位(即对象)。 2.信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障〕,只保留有限的对外接口使之与外部发生联系 (六)继承性: B类的对象拥有A类的全部属性与行为,称作B对A类的继承。假如一个类只继承了另外一个类,这称为单继承。例如:狗继承动物;另外假如一个类从多个类中继承了属性与服务,这称为多继承。例如,客轮继承轮船和客运工具。通常我们称被继承类为父类(superclass,超类),继承类为子类(subclass)。在PHP中只有单继承,但一个类可以被多个类继承。 (七)多态 多态指的是不同的对象调用同一种方法而实现不同的功能的一种能力。简单可以这么理解多态,比如说一个画图函数(即方法),四边形这个对象调用它的时候画出的是四边形,而三角形同样去调用这个函数的时候画出却是三角形,这种能力就指的是多态。 (八)接口 我们知道,PHP是不支持多重继承的,即一个类只能有一个父类,但是有时我们需要综合几个类的功能来形成一个新类,这是PHP引入了接口,接口的特点就在于它是有一系列的抽象方法组成,并且,使用该接口的类必须实现该接口内的所有抽象方法;此外,接口不能声明变量,而且接口里面所有的成员都是PUBLIC访问类型。

    (九)序列化 有时候我们可能需要把对象写入文件或是数据库,也有可能需要把一个对象在网络上传输,并且要求这个对象可以在多个应用应用中保持状态和功能,即形成永久对象,而PHP是不支持永久对象的,这时,通过序列化可以解决这个问题,所谓系列化,就是先把对象转化为二进制串,要利用这个对象时,在通过反序列化将对象还原,生成一个与原来对象具有相同功能与状态的对象。
    常用的关键字与内置方法函数剖析:

    $this

    用于对象内部成员的调用,即对象尚未实例化时,$this代替着对象调用类里面的属性或方法。

    public   protected   private

    这三个关键字用于设定属性或方法的访问类型,分别为:公用|受保护|私有.默认为公用,此时类里类外都有访问权限;受保护类型则只有类与其子类有访问权;而私有类型则只有类内部可以有访问权限。

    static

    静态化成员属性或方法,它能够限制成员受到外部的访问,因为它属于类,不属于任何对象实例,它是在类第一次被加载时为其分配单独的静态内存空间。

    final

    该关键字用于类或成员方法,表示该类不能被继承或该成员方法不允许被覆盖。

    const

    定义一个常量。

    self

    用于类内部访问静态成员或常量。

    parent::fn()

    用于重载父类方法。

    class   abstract   interface

    分别用于声明一个类,一个抽象类,一个接口。

    extends   implements

    分别用于继承一个类与实现一个接口。

    serialize   unserialize

    用于串行化或反串行化一个对象。

    __construct()

    构造函数,创建对象是会自动调用该函数,一般用于执行一些初始化任务。

    __distruct()

    析构函数,当对象销毁时可用来完成一些功能与操作,如关闭文件,释放结果集等等。

    __set()   __get()   __isset()   __unset()

    用于私有成员属性的赋值,取值,检查是否存在,以及删除

    __toString()

    对象引用是一个指针,无法直接用ECHO输出对象的值,而使用该函数可以解决这个问题,即可以直接输出对象的值。

    __clone()

    用于克隆一个对象,并且保证源对象与克隆出的对象相互独立;该方法包含了两个指针:$this与$that;$this指向复本,$that指向原本,因此我们在使用关键字clone克隆对象时可以对原本进行更改。

    __call()

    防止对象调用方法不存在而引起的中断,当调用该方法后,可以指出所调用的不存在的方法名以及参数,并是程序继续执行。

    __autoload()

    在实例化一个对象时调用该函数将自动调用需要的类,而不必在程序文件里使用事先使用多个INCLUDE来引入多个类文件。

    说明:这张表对于初学PHP OOP的人来说,作用大概在于总体预览,而对于实际操作作用不大,因为一则我没有详细说明它们都是怎么用的,二则也没说明怎么用的原理何在,详细的说明可能使这个专题变得很大,建议查阅更详细的资料;对于在使用PHP OOP的人来说起到的作用大概是参考与回顾吧。

    PHP异常处理

    什么是异常? 异常(Exception)用于在指定的错误发生时改变脚本的正常流程,PHP 5 提供了一种新的面向对象的错误处理方法。 当异常被触发时,通常会发生: (1)当前代码状态被保存 (2)代码执行被切换到预定义的异常处理器函数 (3)根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本 本章将为你展示不同的错误处理方法: (1)异常的基本使用 ;(2)创建自定义的异常处理器 ;(3)多个异常(4)重新抛出异常 ;(5)设置顶层异常处理器
    (一)异常的基本使用:Try, throw 和 catch (1)Try: 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。 (2)Throw: 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"(捕获异常) ;如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。 (3)Catch: 代码块会捕获异常,并创建一个包含异常信息的对象
    让我们来触发一个异常:

    <?php //创建可抛出一个异常的函数 function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } //在 "try" 代码块中触发异常 try { checkNum(2); //If the exception is thrown, this text will not be shown echo 'If you see this, the number is 1 or below'; } //捕获异常 catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?> 上面代码将获得类似这样一个错误: Message: Value must be 1 or below

    例子解释: 上面的代码抛出了一个异常,并捕获了它: (1)创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。 (2)在 "try" 代码块中调用 checkNum() 函数。 (3)checkNum() 函数中的异常被抛出 (4)"catch" 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。 (5)通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息
    (二)创建一个自定义的 Exception 类 创建自定义的异常处理程序非常简单。我们简单地创建了一个专门的类,当 PHP 中发生异常时,可调用其函数。该类必须是 exception 类的一个派生类。 创建如下:

    <?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg; } } $email = "someone@example...com"; try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>

    例子解释: (1)上面的代码抛出了一个异常,并通过一个自定义的 exception 类来捕获它: (2)customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法。 (3)创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一条错误消息 (4)把 $email 变量设置为不合法的 e-mail 地址字符串 (5)执行 "try" 代码块,由于 e-mail 地址不合法,因此抛出一个异常 (6)"catch" 代码块捕获异常,并显示错误消息
    (三)多个异常 可以使用多个 if..else 代码块,或一个 switch 代码块,来嵌套多个异常,这些异常能够使用不同的 exception 类,并返回不同的错误消息: 方法如下:

    <?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() .':<b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg; } } $email = "someone@example.com"; try {

    //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid throw new customException($email); } //check for "example" in mail address if(strpos($email, "example") !== FALSE) { throw new Exception("$email is an example e-mail"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>

    例子解释 上面的代码测试了两种条件,如何任何条件不成立,则抛出一个异常: (1)customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法。 (2)创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一个错误消息。 (3)执行 "try" 代码块,在第一个条件下,不会抛出异常。 (4)由于 e-mail 含有字符串 "example",第二个条件会触发异常。 (5)"catch" 代码块会捕获异常,并显示恰当的错误消息 (6)如果没有捕获 customException,仅仅捕获了 base exception,则在最后一个catch块里处理异常。
    (四)重新抛出异常 有时,当异常被抛出时,你也许希望以不同于标准的方式对它进行处理。可以在一个 "catch" 代码块中再次抛出异常。 脚本应该对用户隐藏系统错误。对程序员来说,系统错误也许很重要,但是用户对它们并不感兴趣。为了让用户更容易使用,你可以再次抛出带有对用户比较友好的消息的异常:

    <?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = $this->getMessage().' is not a valid E-Mail address.'; return $errorMsg; } } $email = "someone@example.com"; try { try { //check for "example" in mail address if(strpos($email, "example") !== FALSE) { //throw exception if email is not valid throw new Exception($email); } } catch(Exception $e) { //re-throw exception throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>

    例子解释: 上面的代码检测在邮件地址中是否含有字符串 "example"。如果有,则再次抛出异常: (1)customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法。 (2)创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一个错误消息。 (3)把 $email 变量设置为一个有效的邮件地址,但含有字符串 "example"。 (4)"try" 代码块包含另一个 "try" 代码块,这样就可以再次抛出异常。 (5)由于 e-mail 包含字符串 "example",因此触发异常。 (6)"catch" 捕获到该异常,并重新抛出 "customException"。 (7)捕获到 "customException",并显示一条错误消息。 (8)如果在其目前的 "try" 代码块中异常没有被捕获,则它将在更高层级上查找 catch 代码块。
    (五)设置顶层异常处理器 (Top Level Exception Handler) set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数:

    <?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?> 以上代码的输出应该类似这样: Exception: Uncaught Exception occurred

    例子解释 在上面的代码中,不存在 "catch" 代码块,而是触发顶层的异常处理程序。应该使用此函数来捕获所有未被捕获的异常。
    最后,总结一下异常的规则: (1)需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。 (2)每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。 (3)使用多个 catch 代码块可以捕获不同种类的异常。 (4)可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。

    PHP静态化

    在讲解静态化之前我们来看一下非静态化的情况下WEB用户请求一个PHP页面时经过的工作流程:                                                  

    第一步:用户通过浏览器输入网址或单击链接发出HTTP请求,请求特定的PHP网页。 第二步:Web服务器收到请求,获取该PHP文件,并把它传到PHP引擎。 第三步:PHP引擎对该文件进行解析,文件中若有连接与查询数据库的命令,PHP引擎就会打开通向数据库的连接,发送查询指令。 第四步:数据库接受查询和处理,并把结果返回给PHP引擎。 第五步:PHP完成脚本运行,以HTML格式传回给Web 服务器。 第六步:最后通过HTTP返回请求的PHP网页,此时为HTML文档形式,通过浏览器解释该文档显示在用户的显示器上。 现在我们来看一下PHP静态化的任务是什么,也就说PHP静态化指的是什么: 首先需要明了的是,PHP静态化工作是在后台执行的,用户需要的目标PHP网页其实是已经早已完成PHP引擎执行脚本完毕后存储在Web Server里的HTML静态网页。也许你会说:为什么不直接编写HTML静态网页呢?如果你不打算使用数据库,那确实没有什么必要;但你需要使用数据库存储大量数据的时候,你就必须需要PHP才能与数据库交互了。 PHP静态化的作用何在?我的看法有下面几点: (1)因为已经存储在Web Server里,用户请求特定的页面时,上图显示的工作流程将省去了第2,3,4,5步,明显的可以大大加快网页打开速度; (2)由于静态网页不会受到SQL注入,网站会更安全; (3)静态网页更有利于搜索引擎的收录与抓取; (4)不用调用数据库,服务器端的CPU调用大大减少,增加服务器的性能; (5)综合地发挥了动态技术与静态技术各自的优点。 PHP静态化的实现: 第一种方法:伪静态化,是html格式不过会传递参数,适合一些独立页面; 第二种方法:缓存方式,静态化是服务器做的,实际是个动态的请求,服务器为了可以缓存动态的结果,将链接做了静态化,每次点击链接时服务器接受对应的 参数在缓存中查找,如果没有按照对应关系请求后台并将其加入缓存; 第三种方法:借助模板来完成静态化,这种方法适合大批文件的转化,诸如一个新闻发布系统,只需要先设计一个模板,再将模板中对应的字符串用数据库中读取的内容替换即可,最后利用fso将数据写入html文件 . 我们以第三种方法来实现PHP的静态化: 这个例子模拟商品信息系统进行。 首先创建用于指定要进行静态化数据信息的文件:static.html:

    <form method="post" action="info.php"> 商品名称:<input type="text" name="name" size="20"> 商品信息:<textarea name="info" cols=”10” rows="25"></textarea> <input type="submit" name="提交"> </form>

    接着创建一个模板文件:info.html:

    <html> <body> 商品名称:{name} 商品信息:{info} </body> </html>

    再创建一个静态化用PHP文件:info.php:

    <?php require_once("conn.php"); //引入连接数据库文件 $name=$_POST["name"]; $info=$_POST["info"]; //获得表单变量 $countfile="count.txt"; if(!file_exists($countfile)) { fopen($countfile,"w"); //如果此文件不存在,则自动建立一个 } $fp=fopen($countfile,"r"); $num=fgets($fp,20); $num=$num+1; //每次其值自动加一 fclose($fp); $fp=fopen($countfile,"w"); fwrite($fp,$num); //更新其值 fclose($fp); $houzui=".html"; $path=$num.$houzui; $sql="insert into info (id,name,info,path) values ('','".$title."'.'".$content$path."')"; $query=mysql_query($sql); $fp=fopen("info.html","r"); //只读打开模板 $str=fread($fp,filesize("info.html"));//读取模板中内容 $str=str_replace("{name}",$name,$str); $str=str_replace("{info}",$info,$str);//替换内容 fclose($fp); if(!file_exists($path)){ $handle=fopen($path,"w"); //写入方式打开新闻路径 } fwrite($handle,$str); //把刚才替换的内容写进生成的HTML文件 fclose($handle); ?>

    例子说明: (1)这个例子的关键就在于用函数str_replace()替换模板文件的内容,并且生成新的的网页; (2)实际操作中,模板文件还可以加入大量的美化优化; (3)这个例子生成的静态网页取名是以连续的数字命名,你可以进行任意更改 (4)静态化具体操作不难掌握,关键在于掌握它的理念,非常明了什么时候可以采用静态技术。

     

     

     

    PHP的缓存与使用模板Smarty

    首先来看一下Smarty是什么: Smarty是一个使用PHP写出来的PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP的代码逻辑分离。简单的讲,目的就是要使PHP程序员同美工分离,使程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。 (该释义来自百度百科,非常到位的释义。) 更一般的说法就是:Smart使得能够利用同一个模板通过加入不同的逻辑方法展现不同的功能。这在大型项目上是很有必要的,可以让铸造表现层的工作人员与实现逻辑功能的程序员分工协作,彼此不影响各自的工作。 Smarty的安装 Smarty的安装有别于一般软件的安装,你只需要下载一个压缩包,且只需要利用其中的一个名为libs的文件夹,(里面包含了2个文件夹4份文件),把它放到一个目录下,比如:d:/libs;为了好理解,你可以更该libs为smarty,即:d:/smarty;再在这个目录下新建三个文件夹:templates;templates_c;smarty_cache;文件夹名你可以任取,至于为什么要建立三个文件夹下面会有交待的。 Smarty的配置 要使用Smarty,需要做一些配置,确切的来说就是在你的实现逻辑功能的文件里明确指出要使用Smarty,并且给它一个工作环境。具体做法如下:

    <?php require("smarty/Smarty.class.php");//包含Smarty类文件 $smarty = new Smarty;//建立Smarty实例对象$smarty $smarty->config_dir = "smarty/Config_File_class.php";//引入目录变量 $smarty->caching=false/true//是否使用缓存 $smarty->template_dir ="smarty/templates";//设置模板目录 $smarty->compile_dir ="smarty/templates_c";//设置编译目录 $smarty->cache_dir ="smarty/smarty_cache"; //设置缓存文件夹(这三个文件夹即为上面创建的) $smarty->left_delimiter="{"; $smarty->right_delimiter="}"//这两个设置用于指定左右边界符,即,用于在模板文件中标志何处需要替换。默认为"{"与"}";注意这个标志与同一程序Javascript代码容易产生冲突(如果是通过引入JS文件的方式则不会),此时可以使用Smarty的literal标志来忽略块里的"{ }" ?>

    使用Smarty Smarty有它自己的语法规范,跟我们学习一般的计算机语言差不多,容易上手,它同时作用于模板文件与逻辑程序中,这个专题就如何使用Smarty实现PHP的缓存技术进行讲解,至于更详细的语法,建议查阅相关资料学习。 使用Smarty实现PHP的缓存 首先了解一下缓存是什么以及为什么要采用缓存技术:PHP缓存技术工作时,当程序查询数据的时候,会把相应的结果序列化后保存到文件中,以后同样的查询语句就可以不用直接查询数据库,而是从缓存文件中获得,这一改进使得程序运行速度得以太幅度升. 使用Smarty可以实现页面缓存功能,也很简单,只要设置缓存目录与缓存生命期,而不必过多考虑实现缓存的细节问题,系统会根据设置自动管理缓存。 现在以具体实例来说明Smarty是如何实现PHP的缓存技术的。 案例工作流程:Web用户通过index.htm中的图片链接进入到info.php中查询价格小于200的服饰,信息保存在数据库DB中的clothes_tb表(假设信息只有品牌名title,款式style,价格price,当然表中有自增关键字id),info.php使用了Smarty,模板:model.htm (一)index.htm中关键代码为:

    <a href="info.php"><img src="new.jpg"></a>

    (二)model.htm中关键代码为:

    {section name=list loop=$row} 品牌为:{$row[list].name} 款式为:{$row[list].style} 价格为:{$row[list].price} {/section}

    (三)info.php:这里充分显示怎样使用Smarty模板,以及怎样实现缓存

    require("db_conn.php");//引入数据库连接文件 <?php header("Content-Type:text/html;charset=utf-8"); include_once("smarty/Smarty.class.php"); $smarty=new Smarty(); $smarty->config_dir = "smarty/Config_File.class.php"; $smarty->template_dir ="./templates"; $smarty->compile_dir ="./templates_c"; $smarty->caching = true;//打开缓存 $smarty->cache_dir ="./smarty_cache";//设置缓存目录 $smarty->catch_lifetime=600;//设置缓存时间(600秒) $smarty->left_delimiter="{"; $smarty->right_delimiter="}"; $sql="select * from clothes_tb where price<=200"; $result=mysql_query($sql); while($row=mysql_fetch_array($result)){ $arr[]=array("name"=>$row['name'],"style"=>$row['style'],"price"=>$row['price']); //将信息通过循环语句存储在关联数组里 } $smarty->assign('row',$arr); $smarty->display('model.htm'); ?>

    例子解释 (1)当Web用户再次单击查询价格低于200的服饰信息时,系统将首先查看缓存时间(600s)是否到期,如果没有,它就会取出你设置的缓存的目录里自动生成的文件,而不会再次打开数据库查找信息,这样就大大加快了返回信息的速度。 (2)当然,虽然在缓存时间内系统不会向数据库查找信息,但仍需PHP引擎解析PHP脚本,在PV很大的情况下服务器的负担仍然很重,这时就可以采取静态缓存技术,关于这一点,我将在专题更新时讲解,欢迎关注。 (3)关于Smarty与缓存,如果你对此了解不够,看这章的内容会有些困难,因为它本身还有很多的知识细节在里面,需要你进一步学习,不过,当你具备一定的基础的时候再来看我讲解的,也许会得到更多的帮助。

  • 相关阅读:
    Redhat 7使用CentOS 7的Yum网络源
    指定YUM安装包的体系结构或版本
    CURL常用命令
    VIM技巧之去除代码行号并缩进代码
    VIM 中鼠标选择不选中行号
    linux服务器性能优化
    阻塞,非阻塞,同步,异步
    WEB三层架构与MVC
    mvc与三层结构
    Centos环境下Tomcat启动缓慢
  • 原文地址:https://www.cnblogs.com/fx2008/p/2968904.html
Copyright © 2011-2022 走看看