Rumah >pembangunan bahagian belakang >tutorial php >一分钟了解PHP,一分钟PHP_PHP教程
PHP5编辑
PHP5在长时间的开发及多个预发布版本后,2004年7月13日,PHP5.0发布。该版本以Zend引擎Ⅱ为引擎,并且加入了新功能如PHP Data Objects(PDO)。PHP5.0版本强化更多的功能。首先,完全实现面向对象,提供名为PHP兼容模式的功能。其次是XML功能,PHP5.0版本支持可直观地访问XML数据、名为SimpleXML的XML处理用界面。同时还强化了XMLWeb服务支持,而且标准支持SOAP扩展模块。数据库方面,PHP新版本提供旨在访问MySQL的新界面——MySQL。除此前的界面外,还可以使用面向对象界面和预处理语句(Prepared Statement)等MySQL的新功能.另外,PHP5.0上还捆绑有小容量RDBMS-SQLite.
新对象模式
*构造函数和析构函数 * 对象的引用 * 对象的克隆 * 对象中的私有、公共及受保护模式 * 接口 (Interfaces)
* 抽象类 * __call * __set 和 __get * 静态成员
构造函数和析构函数
在 PHP4 中,当函数与对象同名时,这个函数将成为该对象的构造函数,并且在 PHP4 中没有析构函数的概念。
在 PHP5 中,构造函数被统一命名为 __construct,并且引入了析构函数的概念,被统一命名为 __destruct。
对象的引用
在PHP4中,传递变量给一个函数或方法,实际是把这个变量做了一次复制,也就意味着你传给函数或方法的是这个变量的一个副本,除非你使用了引用符号“&;” 来声明是要做一个引用,而不是一个 Copy。在 PHP5中,对象总是以引用的形式存在的,对象中的赋值操作同样也都是一个引用操作。
对象的克隆
当一个对象始终以引用的形式来被调用时,如果我想得到该对象的一个副本,该怎么办呢?PHP5 提供了一个新的功能,就是对象的克隆,语法为 __clone。
抽象类
抽象类不能被实例化。
抽象类与其它类一样,允许定义变量及方法。
抽象类同样可以定义一个抽象的方法,抽象类的方法不会被执行,不过将有可能会在其派生类中执行。
__call
PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。
__set 和 __get
这是一个很棒的方法,__set 和 __get 方法可以用来捕获一个对象中不存在的变量和方法。
类型指示
在 PHP5 中,你可以在对象的方法中指明其参数必须为另一个对象的实例。
静态成员
静态成员和静态方法在面象对象编程的术语中被称作 “类方法(class methods)” 和 “类变量(class variables)”。
“类方法” 在一个对象没有实例化前允许被调用。同样,“类变量” 在一个对象没有实例化前可以被独立操作控制(不需要用一个对象的方法来控制)。
异常处理
异常处理是公认的处理程序错误的理想方法,在 Java及 C 中都有这个概念,我们欣喜的看到,在 PHP5 已经加入了这方面的应用。你可以尝试使用 “try” 和 “catch” 来控制程序的错误。当有错误发生的时候,代码会把错误交给 “catch” 子句来处理,在 “catch” 子句中,你需要指明要把错误交给某个对象处理,这样做可以使代码结构看起来更清晰,因为我们可以把所有的错误信息交给一个对象来处理。
自定义错误处理
你可以很方便的用自定义的处理错误的代码来控制你的程序中的意外。你仅仅需要从异常类中派生出一个自己的错误控制类,在你自己的错误控制类中,你需要有一个构造函数和一个 getMessage 方法。
命名空间
名称空间对类的分组或函数分组很有用。它可以把一些相关的类或函数给组合到一起,方便以后调用。
例:名称空间
<span> 1</span> <?<span>php </span><span> 2</span> namespacemy\name;<span>//</span><span>参考"定义命名空间"小节</span> <span> 3</span> <span>classMyClass{} </span><span> 4</span> <span>function myfunction(){} </span><span> 5</span> constMYCONST=<span>1</span><span>; </span><span> 6</span> $a=<span>newMyClass; </span><span> 7</span> $c=<span>new</span>\my\name\MyClass;<span>//</span><span>参考"全局空间"小节</span> <span> 8</span> $a=strlen(<span>'</span><span>hi</span><span>'</span>);<span>//</span><span>参考"使用命名空间:后备全局函数/常量"小节</span> <span> 9</span> $d=<span>namespace</span>\MYCONST;<span>//</span><span>参考"namespace操作符和__NAMESPACE__常量”小节</span> <span>10</span> $d=__NAMESPACE__.<span>'</span><span>\MYCONST</span><span>'</span><span>; </span><span>11</span> echo constant($d);<span>//</span><span>参考"命名空间和动态语言特征"小节</span> <span>12</span> ?>
注意你需要在何种情况下使用名称空间,在实际运用中,你可能会需要声明两个或多个名称一样的对象来做不同的事情,那么你就可以把他们分别放到不同的名称空间中去(但接口是要相同的)。
加密
从PHP5.3开始支持ZendGuard加密方式,必须安装Zend Guard Loader,老的zend optimizer将不被支持。
Linux安装Zend Guard Loader支持的过程:
操作系统为CentOS5.5,PHP版本为5.3.8(CentOS5.5中的PHP默认版本较低,如果要升级到PHP最新版,可以使用remi的report源进行升级)。
Windows 下面的 Zend Guard Loader 不支持php5.3.8 VC9 x86 Thread Safe而,php5.3.8 VC9 x86 Non Thread Safe 又不支持 apache。所以安装的话,就需要安装在iis或者和nginx搭配。
1、下载最新的Linux操作系统系下的Zend Guard Loader。
2、上传至Linux服务器并解压缩,注意阅读生成目录下的README文件。全文如下(添加必要的注释)。在/etc/php.d/目录下创建文件zend.ini,内容如下:
<span>1</span> zend_extension=/usr/lib64/php/modules/ZendGuardLoader.so
注意路径一定要写上,刚开始没写路径,老是加载不上ZendGuardLoader .so,也可以直接将上面的配置写入/etc/php.ini文件中,效果一样。
3、重启httpd服务:service httpd restart。
4.输出
相关语法及概念
php 支持八种原始类型。
四种标量类型:boolean(布尔型) integer(整型) float(浮点型,也作“double”) string(字符串)
两种复合类型:array(数组)object(对象)
最后是两种特殊类型:resource(资源)NULL
为了确保代码的易读性,本手册还介绍了一些伪类型:mixed、number、callback
语法(例子中均忽略了PHP代码边界符 ):
注释的语法有三种:
<span>1</span> <span>//</span><span>comment这个是单行注释</span> <span>2</span> <span>/*</span><span>comment<br /> 这个是多行注释<br /></span><span> */</span><span>3</span> <span>#</span><span>comment这个是脚本类型注释,很少用</span>
基本的结构控制语句:
<span> 1</span> <span>//</span><span>分支结构(选择结构)</span> <span> 2</span> <span> 3</span> <span>if</span><span>(condition){ </span><span> 4</span> <span> 5</span> <span>//</span><span>Statement</span> <span> 6</span> <span> 7</span> <span>} </span><span> 8</span> <span> 9</span> <span>if</span><span>(condition){ </span><span>10</span> <span>11</span> <span>//</span><span>Statement</span> <span>12</span> <span>13</span> }<span>else</span><span>{ </span><span>14</span> <span>15</span> <span>//</span><span>Statement</span> <span>16</span> <span>17</span> <span>} </span><span>18</span> <span>19</span> <span>if</span><span>(condition){ </span><span>20</span> <span>21</span> <span>//</span><span>Statement</span> <span>22</span> <span>23</span> }<span>elseif</span><span>(condition){ </span><span>24</span> <span>25</span> <span>//</span><span>Statement</span> <span>26</span> <span>27</span> <span>} </span><span>28</span> <span>//</span><span>多分支结构</span> <span>29</span> <span>switch</span>(<span>$变量</span><span>){ </span><span>30</span> <span>case</span>'值': <span>31</span> <span>//</span><span>Statement</span> <span>32</span> <span>break</span><span>; </span><span>33</span> <span>case</span>'值2': <span>34</span> <span>//</span><span>Statement</span> <span>35</span> <span>break</span><span>; </span><span>36</span> <span>default</span>: <span>37</span> <span>//</span><span>Statement</span> <span>38</span> <span>} </span><span>39</span> <span>40</span> <span>//</span><span>循环结构</span> <span>41</span> <span>42</span> <span>while</span><span>(condition){ </span><span>43</span> <span>//</span><span>Statement</span> <span>44</span> <span>} </span><span>45</span> <span>46</span> <span>47</span> <span>do</span><span>{ </span><span>48</span> <span>//</span><span>Statement</span> <span>49</span> }<span>while</span><span>(condition); </span><span>50</span> <span>51</span> <span>52</span> <span>for</span><span>(初始化;判断;变化){ </span><span>53</span> <span>//</span><span>Statement</span> <span>54</span> <span>} </span><span>55</span> <span>56</span> <span>57</span> <span>//</span><span>数组遍历专用循环语句</span> <span>58</span> <span>59</span> <span>foreach</span>(<span>$Arrayas$value</span><span>){ </span><span>60</span> <span>echo</span><span>$value</span><span>; </span><span>61</span> <span>} </span><span>62</span> <span>63</span> <span>foreach</span>(<span>$Arrayas$key</span>=><span>$value</span><span>){ </span><span>64</span> <span>echo</span><span>$key</span><span>; </span><span>65</span> <span>echo</span><span>$value</span><span>; </span><span>66</span> }
一个PHP实例:
<span> 1</span> <html> <span> 2</span> <head> <span> 3</span> <title>Firstprogram</title> <span> 4</span> </head> <span> 5</span> <body> <span> 6</span> <span>//</span><span>php中string类型的拼接符和其它大多数采用"+"号运算符不一样,而是采用"."号运算 </span><span> 7</span> <span>//在一般语言中用于对象属性和方法调用的"."运算符,则和C语言的结构体一样用"=>"</span> <span> 8</span> <?<span>php </span><span> 9</span> <span>echo</span>"helloworld"."!"<span>; </span><span>10</span> ?> <span>11</span> </body> <span>12</span> </html>
php对面向对象的支持
面向对象编程的概念:
不同的作者之间说法可能不一样,但是一个OOP语言必须有以下几方面:
1.抽象数据类型和信息封装
2.继承
3.多态
在PHP中是通过类来完成封装的:
<span> 1</span> <span>//</span><span>在OOP类中,通常采用大双驼峰命名法,每个单词的首字母都大写</span> <span> 2</span> <span>classSomething{ </span><span> 3</span> <span>//</span><span>作用域修饰符:public公共的;private私有的;protected受保护的; </span><span> 4</span> <span>//属性的名称一般用全小写</span> <span> 5</span> <span>private</span><span>$x</span>=<span>null</span>;<span>//</span><span>在编程建议中,内部使用的属性应该给私有修饰符,然后通过方法取值赋值 </span><span> 6</span> <span> 7</span> <span>//方法的名称一般用小驼峰命名法,第一个单词全小写,剩下的单词首字母大写 </span><span> 8</span> <span>//因为PHP不会自动为变量使用$this所以必须主动加上$this伪变量来指向操作的对象</span> <span> 9</span> publicfunctionsetX(<span>$v</span><span>){ </span><span>10</span> <span>$this</span>->x=<span>$v</span><span>; </span><span>11</span> <span>} </span><span>12</span> <span>publicfunctiongetX(){ </span><span>13</span> <span>return</span><span>$this</span>-><span>x; </span><span>14</span> <span>} </span><span>15</span> }
当然你可以按自己的喜好进行定义,但最好保持一种标准,这样会更有效。数据成员在类中使用"var"声明来定义,在给数据成员赋值之前,它们是没有类型的。一个数据成员可以是一个整数,一个数组,一个相关数组(associative array)或者是一个对象。方法在类中被定义成函数形式,在方法中访问类成员变量时,你应该使用$this->name,否则对一个方法来说,它只能是局部变量。
使用new操作符来创建一个对象:
<span>$obj</span>=newSomething;
然后你可以使用成员函数通过:
<span>$obj</span>->setX(5<span>); </span><span>$see</span>=<span>$obj</span>-><span>getX(); </span><span>echo</span><span>$see</span>;
在这个例子中,setX成员函数将5赋值给对象的成员变量x(不是类的),然后getX返回它的值5。可以象:$obj->x=6那样通过类引用方式来存取数据成员,这不是一个很好的OOP习惯。我强烈建议通过方法来存取成员变量。如果你把成员变量看成是不可处理的,并且只通过对象句柄来使用方法,你将是一个好的OOP程序员。不幸的是,PHP不支持声明私有成员变量,所以不良代码在PHP中也是允许的。继承在PHP中很容易实现,只要使用extends关键字。
<span> 1</span> <span>classAnotherextendsSomething{ </span><span> 2</span> <span>private</span><span>$y</span><span>; </span><span> 3</span> <span> 4</span> publicfunctionsetY(<span>$v</span><span>){ </span><span> 5</span> <span>$this</span>->y=<span>$v</span><span>; </span><span> 6</span> <span>} </span><span> 7</span> <span>functiongetY(){ </span><span> 8</span> <span>return</span><span>$this</span>-><span>y; </span><span> 9</span> <span>} </span><span>10</span> }
"Another"类的对象拥有了父类(Something)的全部的数据成员及方法,而且还加上了自己的数据成员和方法。
你可以使用
<span>1</span> <span>$obj2</span>=<span>newAnother; </span><span>2</span> <span>$obj2</span>->setY(5<span>); </span><span>3</span> <span>echo</span><span>$obj2</span>->getY();
PHP只支持单继承,所以你不能从两个或两个以上类派生出新的类来。你可以在派生类中重定义一个方法,如果我们在"Another"类中重定义了getX方法(方法重写),我们就不能使 用"Something"中的getX方法了。如果你在派生类中声明了一个与基派同名的数据成员,那么当你处理它时, 它将“隐藏”基类的数据成员。
你可以在你的类中定义构造函数。构造函数是一个与类名同名的方法,当你创建一个类的对象时会被调用,例如:
<span> 1</span> <span>classSomething{ </span><span> 2</span> <span>private</span><span>$x</span>=<span>null</span><span>; </span><span> 3</span> <span> 4</span> <span>//</span><span>新版本的构造函数放弃使用类名,而统一使用__construct()</span> <span> 5</span> publicfunction__construct(<span>$x</span><span>){ </span><span> 6</span> <span>$this</span>->x=<span>$x</span><span>; </span><span> 7</span> <span>} </span><span> 8</span> publicfunctionsetX(<span>$v</span><span>){ </span><span> 9</span> <span>$this</span>->x=<span>$v</span><span>; </span><span>10</span> <span>} </span><span>11</span> <span>publicfunctiongetX(){ </span><span>12</span> <span>return</span><span>$this</span>-><span>x; </span><span>13</span> <span>} </span><span>14</span> <span>15</span> <span>//</span><span>析构函数</span> <span>16</span> <span>publicfunction__destruct(){ </span><span>17</span> <span>18</span> <span>} </span><span>19</span> }
所以你可以创建一个对象,通过:
<span>$obj</span>=newSomething(6);
构造函数会自动地把6赋值给数据变量x。构造函数和方法都是普通的PHP函数(”__“两个下划线,魔术方法),所以你可以使用缺省参数。
publicfunction__construct(<span>$x</span>="3",<span>$y</span>="5"<span>){ }</span>
接着:
<span>$obj</span>=newSomething();<span>//</span><span>x=3andy=5</span> <span>$obj</span>=newSomething(8);<span>//</span><span>x=8andy=5</span> <span>$obj</span>=newSomething(8,9);<span>//</span><span>x=8andy=9</span>
缺省参数使用C++的方式,所以你不能忽略Y的值,而给X一个缺省参数,参数是从左到右赋值的,如果传入的参数少于要求的参数时,其作的将使用缺省参数。
当一个派生类的对象被创建时,只有它的构造函数被调用,父类的构造函数没被调用,如果你想调用基类的构造函数,你必须要在派生类的构造函数中用parent::__construct()调用。可以这样做是在派生类中所有父类的方法都是可用的。
<span>1</span> <span>class Another extends Something{ </span><span>2</span> <span>public function__construct(){ </span><span>3</span> parent::__construct(5,6);<span>//</span><span>显示调用基类构造函数</span> <span>4</span> <span>} </span><span>5</span> }
OOP的一个很好的机制是使用抽象类。抽象类是不能实例化,只能提供给派生类一个接口。设计者通常使用抽象类来强迫程序员从基类派生,这样可以确保新的类包含一些期待的功能。在PHP中没有标准的方法,但是:如果你需要这个特性,可以通过定义基类,并在它的构造函数后加上"die" 的调用,这样就可以保证基类是不可实例化的,在每一个方法(接口)后面加上"die" 语句,所以,如果一个程序员在派生类中没有覆盖方法,将引发一个错误。而且因为PHP 是无类型的,你可能需要确认一个对象是来自于你的基类的派生类,那么在基类中增加一个方法来实义类的身份(返回某种标识id),并且在你接收到一个对象参数时校验这个值。当然,如果一个不好的邪恶程序员在派生类中覆盖了这个方法,这种方法就不起作用了,不过一般问题多在懒惰的程序员身上,而不是邪恶的程序员。
当然,能够让基类对程序员无法看到是很好的,只要将接口打印出来做他们的工作就可以了。PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。[3]
重载(与覆盖不同)在PHP中不支持,因为PHP是弱类型语言。在OOP中,你可以重载一个方法来实现两个或重多的方法具有相同的名字,但是有不同数量或类型的参数(这要看语言)。PHP 是一种松散类型的语言,所以通过类型重载不起作用,然而通过参数的个数不同来重载也不起作用。
有时在OOP中重载构造函数非常好,这样你可以通过不同的方法创建对象(变量函数)。在PHP中实现它的技巧是:
<span> 1</span> <span>class Myclass{ </span><span> 2</span> <span>public function Myclass(){ </span><span> 3</span> <span>$name</span>="Myclass".<span>func_num_args</span>();<span>//</span><span>这个函数返回的是传过来参数的个数</span> <span> 4</span> <span>$this</span>-><span>$name</span>();<span>//</span><span>这里使用的是一个变量函数,以这个变量的值作为函数的名称调用</span> <span> 5</span> <span>} </span><span> 6</span> public function Myclass1(<span>$x</span><span>){ </span><span> 7</span> <span>//</span><span>code</span> <span> 8</span> <span>} </span><span> 9</span> public function Myclass2(<span>$x</span>,<span>$y</span><span>){ </span><span>10</span> <span>//</span><span>code</span> <span>11</span> <span>} </span><span>12</span> }
通过在类中的额外的处理,使用这个类对用户是透明的:
<span>1</span> <span>$obj1</span>=newMyclass('1');<span>//</span><span>将调用Myclass1</span> <span>2</span> <span>$obj2</span>=newMyclass('1','2');<span>//</span><span>将调用Myclass2</span>
有时这个非常好用。
多态
多态是对象的一种能力,它可以在运行时刻根据传递的对象参数,决定调用哪一个对象的方法。例如,如果你有一个figure的类,它定义了一个draw的方法。并且派生了circle和rectangle 类,在派生类中你覆盖了draw方法,你可能还有一个函数,它希望使用一个参数x,并且可以调用$x->draw()。如果你有多态性,调用哪个draw方法就依赖于你传递给这个函数的对象类型。
多态性在象PHP这样的解释语言(想象一下一个C++编译器生成这样的代码,你应该调用哪一个方法?你也不知道你拥有的对象是什么类型的,好,这不是重点)是非常容易和自然的。所以PHP当然支持多态性。
<span> 1</span> <span>classCalc{ </span><span> 2</span> functionniceDrawing(<span>$x</span>){<span>//</span><span>假设这是Board类的一个方法</span> <span> 3</span> <span>$x</span>-><span>draw(); </span><span> 4</span> <span>} </span><span> 5</span> <span>} </span><span> 6</span> <span> 7</span> <span>classCircle{ </span><span> 8</span> <span>publicfunctiondraw(){ </span><span> 9</span> <span>echo</span>"画了一个圆"<span>; </span><span>10</span> <span>} </span><span>11</span> <span>} </span><span>12</span> <span>13</span> <span>classRectangle{ </span><span>14</span> <span>publicfunctiondraw(){ </span><span>15</span> <span>echo</span>"画了一个矩形"<span>; </span><span>16</span> <span>} </span><span>17</span> <span>} </span><span>18</span> <span>$board</span>=<span>newCalc; </span><span>19</span> <span>$obj</span>=newCircle(3,187<span>); </span><span>20</span> <span>$obj2</span>=newRectangle(4,5<span>); </span><span>21</span> <span>$board</span>->niceDrawing(<span>$obj</span>);<span>//</span><span>将调用Circle的draw方法</span> <span>22</span> <span>$board</span>->niceDrawing(<span>$obj2</span>);<span>//</span><span>将调用Rectangle的draw方法</span>
用PHP进行面向对象编程
一些"纯化论者(purists)"可能会说PHP不是一个真正的面向对象的语言,这是事实。PHP 是一个混合型语言,你可以使用OOP,也可以使用传统的过程化编程。然而,对于大型项目,你可能想/需要在PHP 中使用纯的OOP去声明类,而且在你的项目只用对象和类。
随着项目越来越大,使用OOP可能会有帮助,OOP代码很容易维护,容易理解和重用。这些就是软件工程的基础。在基于web的项目中应用这些概念就成为将来网站成功的关键。
高级OOP技术
在看过基本的OOP概念后,我就可以向你展示更高级的技术:
序列化(Serializing)
PHP不支持永久对象,在OOP中永久对象是可以在多个应用的引用中保持状态和功能的对象,这意味着拥有将对象保存到一个文件或数据库中的能力,而且可以在以后装入对象。这就是所谓的序列化机制。PHP 拥有序列化方法,它可以通过对象进行调用,序列化方法可以返回对象的字符串表示。然而,序列化只保存了对象的成员数据而不包括方法。
在PHP4中,如果你将对象序列化到字符串$s中,然后释放对象,接着反序列化对象到$obj,你可以继续使用对象的方法!我不建议这样去做,因为(a)文档中没有保证这种行为在以后的版本中仍然可以使用。(b) 这个可能导致一种误解,在你把一个序列化后的版本保存到磁盘并退出脚本时。当以后运行这个脚本时,你不能期待着在反序列化一个对象时,对象的方法也会在那里,因为字符串表示根本就不包括方法。
总而言之,PHP 进行序列化对于保存对象的成员变量非常有用。(你也可以将相关数组和数组序列化到一个文件中)。
例子 :
<span>1</span> <span>$obj</span>=<span>newClassfoo(); </span><span>2</span> <span>$str</span>=<span>serialize</span>(<span>$obj</span>);<span>//</span><span>保存$str到磁盘上</span> <span>3</span> <span>$obj2</span>=<span>unserialize</span>(<span>$str</span>);<span>//</span><span>几个月以后//从磁盘中装入str</span>
你恢复了成员数据,但是不包括方法(根据文档所说)。这导致了只能通过类似于使用$obj2->x来存取成员变量(你没有别的方法!)的唯一办法,所以不要在家里试它。
有一些办法可以解决这个问题,我把它留着,因为对这篇简洁的文章来说,他们太不好。我会很高兴地欢迎在PHP的后续版本中有全序列化的特性。
使用类进行数据存储PHP和OOP一件非常好的事情就是,你可以很容易地定义一个类来操作某件事情,并且无论何时你想用的时候都可以调用相应的类。假设你有一个HTML表单,用户可以通过选择产品ID号来选择一个产品。在数据库中有产品的信息,你想把产品显示出来,显示它的价格等等。你拥有不同类型的产品,并且同一个动作可能对不同的产品具有不同的意思。例如,显示一个声音可能意味着播放它,但是对于其它种类的产品可能意味着显示一个存在数据库中的图片。你可以使用OOP或PHP来减少编码并提高质量:
定义一个产品的类,定义它应该有的方法(例如:显示),然后定义对每一种类型的产品的类,从产品类派后出来(SoundItem类,ViewableItem类,等等),覆盖在产品类中的方法,使它们按你的想法动作。
根据数据库中每一种产品的类型(type)字段给类命名,一个典型的产品表可能有(id,type,price,description,等等字段)...然后在处理脚本中,你可以从数据库中取出type值,然后实例化一个名为type的对象:
<span>1</span> <span>$obj</span>=<span>new</span><span>$type</span><span>(); </span><span>2</span> <span>$obj</span>->action();
这是PHP的一个非常好的特性,你可以不用考虑对象的类型,调用$obj的显示方法或其它的方法。使用这个技术,你不需要修改脚本去增加一个新类型的对象,只是增加一个处理它的类。
这个功能很强大,只要定义方法,而不去考虑所有对象的类型,在不同的类中按不同的方法实现它们,然后在主脚本中对任意对象使用它们,没有if...else,也不需要两个程序员,只有高兴。
你同意编程是容易的,维护是便宜的,可重用是真的吗?
如果你管理一组程序员,分配工作就是很简单的了,每个人可能负责一个类型的对象和处理它的类。
可以通过这个技术实现国际化,根据用户所选的语言字段应用相应的类就可以了,等等。
拷贝和克隆
当你创建一个$obj的对象时,你可以通过$obj2=$obj来拷贝对象,新的对象是$obj的一个拷贝(不是一个引用),所以它具有$obj在当时的状态。有时候,你不想这样,你只是想生成一个象obj类一样的一个新的对象,可以通过使用new语句来调用类的构造函数。在PHP中也可以通过序列化,和一个基类来实现,但所有的其它类都要从基类派生出来。
进入危险区域
当你序列化一个对象,你会得到某种格式的字符串,如果你感兴趣,你可以调究它,其中,字符串中有类的名字(太好了!),你可以把它取出来,象:
<span>1</span> <span>$herring</span>=<span>serialize</span>(<span>$obj</span><span>); </span><span>2</span> <span>$vec</span>=<span>explode</span>(':',<span>$herring</span>);<span>//</span><span>以:为标识符把字符串拆分成一个数组</span> <span>3</span> <span>$nam</span>=<span>str_replace</span>("\",'',<span>$vec</span>[2]);
所以假设你创建了一个"Universe"的类,并且强制所有的类都必须从universe扩展,你可以在universe 中定义一个clone的方法,如下:
<span> 1</span> <span>classUniverse{ </span><span> 2</span> <span> 3</span> <span>//</span><span>在新的PHP版本中克隆(__clone())是一个魔术方法,不要和这个方法搞混了</span> <span> 4</span> <span> 5</span> <span>functionclone(){ </span><span> 6</span> <span> 7</span> <span>$herring</span>=<span>serialize</span>(<span>$this</span><span>); </span><span> 8</span> <span> 9</span> <span>$vec</span>=<span>explode</span>(':',<span>$herring</span><span>); </span><span>10</span> <span>11</span> <span>$nam</span>=<span>str_replace</span>("\"",'',<span>$vec</span>[2<span>]); </span><span>12</span> <span>13</span> <span>$ret</span>=<span>new</span><span>$nam</span><span>; </span><span>14</span> <span>return</span><span>$ret</span><span>; </span><span>15</span> <span>16</span> <span>} </span><span>17</span> <span>18</span> }<span>//</span><span>然后</span> <span>19</span> <span>20</span> <span>$obj</span>=newSomething();<span>//</span><span>从Universe扩展</span> <span>21</span> <span>22</span> <span>$other</span>=<span>$obj</span>-><span>clone</span>();
你所得到的是一个新的Something类的对象,它同使用new方法,调用构造函数创建出的对象一样。我不知道这个对你是否有用,但是Universe类可以知道派生类的名字是一个好的经验。想象是唯一的限制。
模板引擎
框架介绍thinkphp
ThinkPHP是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。
PHP认证级别
PHP课程由初级(IFE)、中级(IPE)和高级(IAE)三个部分。
PHP安全
PHP其实不过是Web服务器的一个模块功能,所以首先要保证Web服务器的安全。当然Web服务器要安全又必须是先保证系统安全,这样就扯远了,无穷无尽。常见的web安全漏洞有:注入攻击,跨站攻击,服务器自身漏洞等,对应的详细解释,详见:扩展阅读中的《WEB安全性-2010_OWASP_TOP10》,这里有很详尽的解释。
PHP的优点学习过程和方法
PHP的语法类似于C,Perl,ASP或者JSP。对于那些对上述之一的语言较熟悉的人来说,PHP太简单了。相反的,如果你对PHP了解较多,那么你对于其他几种语言的学习都很简单了。你只需要很短的时间内将PHP的核心语言特点全部掌握,你可能已经非常了解HTML,甚至你已经知道怎样用编辑设计软件或者手工来制作好看的WEB站点。由于PHP代码能够无障碍的添加进你的站点,在你设计和维护站点的同时,你可以很轻松的加入PHP使得你的站点更加具有动态特性。
数据库连接
PHP可以编译成具有与许多数据库相连接的函数。PHP与MySQL是绝佳的组合,如果再加上Apache服务器,就是相当完美的了。你还可以自己编写外围的函数取间接存取数据库。通过这样的途径当你更换使用的数据库时,可以轻松的更改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。
可扩展性
就像前面说的那样,PHP已经进入了一个高速发展的时期。对于一个非程序员来说为PHP扩展附加功能可能会比较难,但是对于一个PHP程序员来说并不困难。
PHP可伸缩性
传统上网页的交互作用是通过CGI来实现的。CGI程序的伸缩性不很理想,因为它为每一个正在运行的CGI程序开一个独立进程。解决方法就是将经常用来编写CGI程序的语
记事本保存php文件注意事项
言的解释器编译进你的web服务器(比如mod_perl,JSP)。PHP就可以以这种方式安装,虽然很少有人愿意这样以CGI方式安装它。内嵌的PHP可以具有更高的可伸缩性。
PHP免费安装
PHP源代码包安装版:这个版本适合已经有自己独立的网站域名、网站空间的专业网站建设用户。使用方法依然其为简单,只需三步:
第一、到官方网站:下载 PHP源代码包安装版最新版本,解压下载文件,将其中的全部内容上传到你的支持PHP的网站空间
第二、改更文件属性,请将根目录下以PHP为后缀名的文件和”/include/domain.php”和 “/attachments” 和 “/data”文件夹以及文件夹下所有的文件属性改成“可读”、“可写”、“可执行”,通常是“755”。
第三、打开你的网站根目录,系统会自动运行setup安装程序,按提示点下一步操作即可。
友情提示:当你下载我们的软件并看到这份说明时,则说明你一定是对企业网站建设有一定的需求或者你是一个网站建设技术学习者。
文件格式
1.对于只含有 php 代码的文件,我们将在文件结尾处忽略掉 "?>"。这是为了防止多余的空格或者其它字符影响到代码。
例如:
$foo = 'foo';
2.缩进应该能够反映出代码的逻辑结果,尽量使用四个空格,禁止使用制表符TAB,因为这样能够保证有跨客户端编程器软件的灵活性。
例如:
<span>1</span> <span>if</span>(1==<span>$x</span><span>){ </span><span>2</span> <span>$indented_code</span>=1<span>; </span><span>3</span> <span>if</span>(1==<span>$new_line</span><span>){ </span><span>4</span> <span>$more_indented_code</span>=1<span>; </span><span>5</span> <span>} </span><span>6</span> }
3.变量赋值建议保持相等间距和排列。
例如:
<span>1</span> <span>$variable</span>='demo'<span>; </span><span>2</span> <span>$var</span>='demo2';
4.每行代码长度应控制在80个字符以内,最长不超过120个字符。因为 linux 读入文件一般以80列为单位,就是说如果一行代码超过80个字符,那么系统将为此付出额外操作指令。这个虽然看起来是小问题,但是对于追求完美的程序员来说也是值得注意并遵守的规范。
5.每行结尾不允许有多余的空格。
Php文件记事本编辑乱码问题
一般情况下,记事本编辑器在对文件进行完编辑并保存之时,其默认编码为ANSI,中文。然则更多的时候,php在语言环境设置时语言多数为utf-8,直接保存并用于apache等http-server解析后就会出现乱码。
为此,应该注意在用记事本编辑完后可将文件用“另存为”的方式对文件进行保存,并将“文件类型”选择“所有文件”,编码与文件指定语言编码一致即可。[4]
算数运算符
PHP 的运算符包括算术运算符、赋值运算符、比较运算符和逻辑运算符。[5]
算数运算符:
加,减,乘,除,取模(取余)
+、-、*、/、%
赋值运算符:(以下解释在许多书中有所不同)
赋值,加赋值,减赋值、乘赋值、除赋值,连字赋值
=、+=、-=、*=、/=、.=
位运算符:
位与、位或、位亦或、位非、左移、右移
&、|、^、~、>
比较运算符:
等于、全等于、不等于、不全等于、大于、小于、大于等于、小于等于
==、===、!=()、!==、>、=、
逻辑运算符:
逻辑与、逻辑或、逻辑非、逻辑亦或
&&、||、!、xor
字符串运算符:
. 连接两个字符串