1 分でわかる PHP について学ぶ
PHP5 Editor
長期間の開発と複数のプレリリース バージョンを経て、PHP5.0 は 2004 年 7 月 13 日にリリースされました。このバージョンでは、エンジンとして Zend Engine II を使用し、PHP データ オブジェクト (PDO) などの新機能が追加されています。 PHP5.0バージョンではさらに機能が強化されました。まず、完全なオブジェクト指向であり、PHP互換モード と呼ばれる機能を提供します。次にXML機能ですが、PHP5.0版ではXMLデータに直感的にアクセスできるSimpleXMLというXML処理インターフェースをサポートしています。同時にXMLWebサービスのサポートも強化し、SOAP拡張モジュールを標準サポートする。データベースに関しては、PHP の新しいバージョンは、MySQL にアクセスするために設計された新しいインターフェイス、MySQL を提供します。これまでのインターフェイスに加えて、オブジェクト指向インターフェイスやプリペアド ステートメント (Prepared Statement) などの MySQL の新機能も使用できます。また、PHP5.0には小容量のRDBMS-SQLiteもバンドルされています。
新しいオブジェクト モード
* コンストラクターとデストラクター * オブジェクトの参照* オブジェクトのクローン* オブジェクトのプライベート モード、パブリック モード、プロテクト モード*Interfaces(Interfaces)
* 抽象クラス* __call * __set と __get * 静的メンバー
コンストラクターとデストラクター
PHP4 では、関数がオブジェクトと同じ名前の場合、この関数がコンストラクターになりますPHP4 にはデストラクターの概念がありません。
PHP5 では、コンストラクターは __construct という名前で統一され、デストラクターの概念が導入され、一律 __destruct という名前が付けられます。
オブジェクト参照
PHP4 では、関数またはメソッドに変数を渡すと、実際には変数がコピーされます。つまり、関数またはメソッドに渡すのは変数のコピーです。参照記号「&;」を使用して、それがコピーではなく参照であることを宣言します。 PHP5ではオブジェクトは常に参照の形で存在し、オブジェクトへの代入操作も参照操作となります。
オブジェクトのクローン
オブジェクトが常に参照として呼び出される場合、オブジェクトのコピーを取得したい場合はどうすればよいですか? PHP5 は、__clone 構文を使用したオブジェクトのクローン作成という新機能を提供します。
抽象 クラス
抽象クラスはインスタンス化できません。
抽象クラスでは、他のクラスと同様に、変数とメソッドを定義できます。
抽象クラスでも抽象メソッドを定義できます。抽象クラスのメソッドは実行されませんが、その派生クラスで実行される可能性があります。
__call
PHP5 オブジェクトには、オブジェクト内の他のメソッドを監視するために使用される新しい特別なメソッド __call() があります。オブジェクトに存在しないメソッドを呼び出そうとすると、__call メソッドが自動的に呼び出されます。
__set および __get
これは優れたメソッドです。__set メソッドと __get メソッドを使用して変数をキャプチャし、オブジェクトに存在しないメソッド。
型の指示
PHP5 では、オブジェクトのメソッドで、そのパラメーターが別のオブジェクトのインスタンスである必要があることを指定できます。
静的メンバー
静的メンバーおよび静的メソッドは、オブジェクト指向プログラミングの用語では「クラス メソッド」および「クラス変数」と呼ばれます。
オブジェクトがインスタンス化される前に「クラスメソッド」を呼び出すことができます。同様に、「クラス変数」は、オブジェクトがインスタンス化される前に (オブジェクトのメソッドを使用して制御することなく) 独立して制御できます。
例外処理
例外処理は、プログラム エラーを処理するための理想的な方法として認識されています。この概念は Java と C で利用できます。この側面が PHP5 アプリケーションに追加されたことを嬉しく思います。 。 「try」と「catch」を使用してプログラム エラーを制御してみることができます。エラーが発生した場合、コードは処理のためにエラーを「catch」句に渡します。これにより、エラーが処理のためにオブジェクトに渡されることを指定する必要があります。すべてのエラー メッセージを処理するオブジェクトに渡すことができるため、コード構造は Clearer と似ています。
カスタム エラー処理
カスタム エラー処理コードを使用して、プログラム内の事故を簡単に制御できます。独自のエラー制御クラスを例外クラスから派生する必要があるのは、コンストラクターと getMessage メソッドだけです。
名前空間
名前空間は、クラスや関数をグループ化するのに役立ちます。関連するクラスや関数をグループ化して、後で簡単に呼び出すことができます。
例: 名前空間
<span style="color: #008080;"> 1</span> <?<span style="color: #000000;">php</span><span style="color: #008080;"> 2</span> namespacemy\name;<span style="color: #008000;">//</span><span style="color: #008000;">参考"定义命名空间"小节</span><span style="color: #008080;"> 3</span> <span style="color: #000000;">classMyClass{}</span><span style="color: #008080;"> 4</span> <span style="color: #000000;">function myfunction(){}</span><span style="color: #008080;"> 5</span> constMYCONST=<span style="color: #800080;">1</span><span style="color: #000000;">;</span><span style="color: #008080;"> 6</span> $a=<span style="color: #000000;">newMyClass;</span><span style="color: #008080;"> 7</span> $c=<span style="color: #0000ff;">new</span>\my\name\MyClass;<span style="color: #008000;">//</span><span style="color: #008000;">参考"全局空间"小节</span><span style="color: #008080;"> 8</span> $a=strlen(<span style="color: #800000;">'</span><span style="color: #800000;">hi</span><span style="color: #800000;">'</span>);<span style="color: #008000;">//</span><span style="color: #008000;">参考"使用命名空间:后备全局函数/常量"小节</span><span style="color: #008080;"> 9</span> $d=<span style="color: #0000ff;">namespace</span>\MYCONST;<span style="color: #008000;">//</span><span style="color: #008000;">参考"namespace操作符和__NAMESPACE__常量”小节</span><span style="color: #008080;">10</span> $d=__NAMESPACE__.<span style="color: #800000;">'</span><span style="color: #800000;">\MYCONST</span><span style="color: #800000;">'</span><span style="color: #000000;">;</span><span style="color: #008080;">11</span> echo constant($d);<span style="color: #008000;">//</span><span style="color: #008000;">参考"命名空间和动态语言特征"小节</span><span style="color: #008080;">12</span> ?>
実際のアプリケーションでは、名前空間を 2 つまたは If 宣言する必要がある場合があることに注意してください。同じ名前を持つ複数のオブジェクトは異なる動作を行うため、それらを異なる名前空間に置くことができます (ただし、インターフェイスは同じである必要があります)。
暗号化
PHP5.3 以降、ZendGuard 暗号化方式がサポートされます。古い Zend オプティマイザーはサポートされません。
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 style="color: #008080;">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 style="color: #008080;">1</span> <span style="color: #008000;">//</span><span style="color: #008000;">comment这个是单行注释</span><span style="color: #008080;">2</span> <span style="color: #008000;">/*</span><span style="color: #008000;">comment<br> 这个是多行注释<br></span><span style="color: #008000;"> */</span><span style="color: #008080;">3</span> <span style="color: #008000;">#</span><span style="color: #008000;">comment这个是脚本类型注释,很少用</span>
基本的结构控制语句:
<span style="color: #008080;"> 1</span> <span style="color: #008000;">//</span><span style="color: #008000;">分支结构(选择结构)</span><span style="color: #008080;"> 2</span> <span style="color: #008080;"> 3</span> <span style="color: #0000ff;">if</span><span style="color: #000000;">(condition){</span><span style="color: #008080;"> 4</span> <span style="color: #008080;"> 5</span> <span style="color: #008000;">//</span><span style="color: #008000;">Statement</span><span style="color: #008080;"> 6</span> <span style="color: #008080;"> 7</span> <span style="color: #000000;">}</span><span style="color: #008080;"> 8</span> <span style="color: #008080;"> 9</span> <span style="color: #0000ff;">if</span><span style="color: #000000;">(condition){</span><span style="color: #008080;">10</span> <span style="color: #008080;">11</span> <span style="color: #008000;">//</span><span style="color: #008000;">Statement</span><span style="color: #008080;">12</span> <span style="color: #008080;">13</span> }<span style="color: #0000ff;">else</span><span style="color: #000000;">{</span><span style="color: #008080;">14</span> <span style="color: #008080;">15</span> <span style="color: #008000;">//</span><span style="color: #008000;">Statement</span><span style="color: #008080;">16</span> <span style="color: #008080;">17</span> <span style="color: #000000;">}</span><span style="color: #008080;">18</span> <span style="color: #008080;">19</span> <span style="color: #0000ff;">if</span><span style="color: #000000;">(condition){</span><span style="color: #008080;">20</span> <span style="color: #008080;">21</span> <span style="color: #008000;">//</span><span style="color: #008000;">Statement</span><span style="color: #008080;">22</span> <span style="color: #008080;">23</span> }<span style="color: #0000ff;">elseif</span><span style="color: #000000;">(condition){</span><span style="color: #008080;">24</span> <span style="color: #008080;">25</span> <span style="color: #008000;">//</span><span style="color: #008000;">Statement</span><span style="color: #008080;">26</span> <span style="color: #008080;">27</span> <span style="color: #000000;">}</span><span style="color: #008080;">28</span> <span style="color: #008000;">//</span><span style="color: #008000;">多分支结构</span><span style="color: #008080;">29</span> <span style="color: #0000ff;">switch</span>(<span style="color: #800080;">$变量</span><span style="color: #000000;">){</span><span style="color: #008080;">30</span> <span style="color: #0000ff;">case</span>'值':<span style="color: #008080;">31</span> <span style="color: #008000;">//</span><span style="color: #008000;">Statement</span><span style="color: #008080;">32</span> <span style="color: #0000ff;">break</span><span style="color: #000000;">;</span><span style="color: #008080;">33</span> <span style="color: #0000ff;">case</span>'值2':<span style="color: #008080;">34</span> <span style="color: #008000;">//</span><span style="color: #008000;">Statement</span><span style="color: #008080;">35</span> <span style="color: #0000ff;">break</span><span style="color: #000000;">;</span><span style="color: #008080;">36</span> <span style="color: #0000ff;">default</span>:<span style="color: #008080;">37</span> <span style="color: #008000;">//</span><span style="color: #008000;">Statement</span><span style="color: #008080;">38</span> <span style="color: #000000;">}</span><span style="color: #008080;">39</span> <span style="color: #008080;">40</span> <span style="color: #008000;">//</span><span style="color: #008000;">循环结构</span><span style="color: #008080;">41</span> <span style="color: #008080;">42</span> <span style="color: #0000ff;">while</span><span style="color: #000000;">(condition){</span><span style="color: #008080;">43</span> <span style="color: #008000;">//</span><span style="color: #008000;">Statement</span><span style="color: #008080;">44</span> <span style="color: #000000;">}</span><span style="color: #008080;">45</span> <span style="color: #008080;">46</span> <span style="color: #008080;">47</span> <span style="color: #0000ff;">do</span><span style="color: #000000;">{</span><span style="color: #008080;">48</span> <span style="color: #008000;">//</span><span style="color: #008000;">Statement</span><span style="color: #008080;">49</span> }<span style="color: #0000ff;">while</span><span style="color: #000000;">(condition);</span><span style="color: #008080;">50</span> <span style="color: #008080;">51</span> <span style="color: #008080;">52</span> <span style="color: #0000ff;">for</span><span style="color: #000000;">(初始化;判断;变化){</span><span style="color: #008080;">53</span> <span style="color: #008000;">//</span><span style="color: #008000;">Statement</span><span style="color: #008080;">54</span> <span style="color: #000000;">}</span><span style="color: #008080;">55</span> <span style="color: #008080;">56</span> <span style="color: #008080;">57</span> <span style="color: #008000;">//</span><span style="color: #008000;">数组遍历专用循环语句</span><span style="color: #008080;">58</span> <span style="color: #008080;">59</span> <span style="color: #0000ff;">foreach</span>(<span style="color: #800080;">$Arrayas$value</span><span style="color: #000000;">){</span><span style="color: #008080;">60</span> <span style="color: #0000ff;">echo</span><span style="color: #800080;">$value</span><span style="color: #000000;">;</span><span style="color: #008080;">61</span> <span style="color: #000000;">}</span><span style="color: #008080;">62</span> <span style="color: #008080;">63</span> <span style="color: #0000ff;">foreach</span>(<span style="color: #800080;">$Arrayas$key</span>=><span style="color: #800080;">$value</span><span style="color: #000000;">){</span><span style="color: #008080;">64</span> <span style="color: #0000ff;">echo</span><span style="color: #800080;">$key</span><span style="color: #000000;">;</span><span style="color: #008080;">65</span> <span style="color: #0000ff;">echo</span><span style="color: #800080;">$value</span><span style="color: #000000;">;</span><span style="color: #008080;">66</span> }
一个PHP实例:
<span style="color: #008080;"> 1</span> <html><span style="color: #008080;"> 2</span> <head><span style="color: #008080;"> 3</span> <title>Firstprogram</title><span style="color: #008080;"> 4</span> </head><span style="color: #008080;"> 5</span> <body><span style="color: #008080;"> 6</span> <span style="color: #008000;">//</span><span style="color: #008000;">php中string类型的拼接符和其它大多数采用"+"号运算符不一样,而是采用"."号运算</span><span style="color: #008080;"> 7</span> <span style="color: #008000;">//在一般语言中用于对象属性和方法调用的"."运算符,则和C语言的结构体一样用"=>"</span><span style="color: #008080;"> 8</span> <?<span style="color: #000000;">php</span><span style="color: #008080;"> 9</span> <span style="color: #0000ff;">echo</span>"helloworld"."!"<span style="color: #000000;">;</span><span style="color: #008080;">10</span> ?><span style="color: #008080;">11</span> </body><span style="color: #008080;">12</span> </html>
php对面向对象的支持
面向对象编程的概念:
不同的作者之间说法可能不一样,但是一个OOP语言必须有以下几方面:
1.抽象数据类型和信息封装
2.继承
3.多态
在PHP中是通过类来完成封装的:
<span style="color: #008080;"> 1</span> <span style="color: #008000;">//</span><span style="color: #008000;">在OOP类中,通常采用大双驼峰命名法,每个单词的首字母都大写</span><span style="color: #008080;"> 2</span> <span style="color: #000000;">classSomething{</span><span style="color: #008080;"> 3</span> <span style="color: #008000;">//</span><span style="color: #008000;">作用域修饰符:public公共的;private私有的;protected受保护的;</span><span style="color: #008080;"> 4</span> <span style="color: #008000;">//属性的名称一般用全小写</span><span style="color: #008080;"> 5</span> <span style="color: #0000ff;">private</span><span style="color: #800080;">$x</span>=<span style="color: #0000ff;">null</span>;<span style="color: #008000;">//</span><span style="color: #008000;">在编程建议中,内部使用的属性应该给私有修饰符,然后通过方法取值赋值</span><span style="color: #008080;"> 6</span> <span style="color: #008080;"> 7</span> <span style="color: #008000;">//方法的名称一般用小驼峰命名法,第一个单词全小写,剩下的单词首字母大写</span><span style="color: #008080;"> 8</span> <span style="color: #008000;">//因为PHP不会自动为变量使用$this所以必须主动加上$this伪变量来指向操作的对象</span><span style="color: #008080;"> 9</span> publicfunctionsetX(<span style="color: #800080;">$v</span><span style="color: #000000;">){</span><span style="color: #008080;">10</span> <span style="color: #800080;">$this</span>->x=<span style="color: #800080;">$v</span><span style="color: #000000;">;</span><span style="color: #008080;">11</span> <span style="color: #000000;">}</span><span style="color: #008080;">12</span> <span style="color: #000000;">publicfunctiongetX(){</span><span style="color: #008080;">13</span> <span style="color: #0000ff;">return</span><span style="color: #800080;">$this</span>-><span style="color: #000000;">x;</span><span style="color: #008080;">14</span> <span style="color: #000000;">}</span><span style="color: #008080;">15</span> }
当然你可以按自己的喜好进行定义,但最好保持一种标准,这样会更有效。数据成员在类中使用"var"声明来定义,在给数据成员赋值之前,它们是没有类型的。一个数据成员可以是一个整数,一个数组,一个相关数组(associative array)或者是一个对象。方法在类中被定义成函数形式,在方法中访问类成员变量时,你应该使用$this->name,否则对一个方法来说,它只能是局部变量。
使用new操作符来创建一个对象:
<span style="color: #800080;">$obj</span>=newSomething;
然后你可以使用成员函数通过:
<span style="color: #800080;">$obj</span>->setX(5<span style="color: #000000;">);</span><span style="color: #800080;">$see</span>=<span style="color: #800080;">$obj</span>-><span style="color: #000000;">getX();</span><span style="color: #0000ff;">echo</span><span style="color: #800080;">$see</span>;
在这个例子中,setX成员函数将5赋值给对象的成员变量x(不是类的),然后getX返回它的值5。可以象:$obj->x=6那样通过类引用方式来存取数据成员,这不是一个很好的OOP习惯。我强烈建议通过方法来存取成员变量。如果你把成员变量看成是不可处理的,并且只通过对象句柄来使用方法,你将是一个好的OOP程序员。不幸的是,PHP不支持声明私有成员变量,所以不良代码在PHP中也是允许的。继承在PHP中很容易实现,只要使用extends关键字。
<span style="color: #008080;"> 1</span> <span style="color: #000000;">classAnotherextendsSomething{</span><span style="color: #008080;"> 2</span> <span style="color: #0000ff;">private</span><span style="color: #800080;">$y</span><span style="color: #000000;">;</span><span style="color: #008080;"> 3</span> <span style="color: #008080;"> 4</span> publicfunctionsetY(<span style="color: #800080;">$v</span><span style="color: #000000;">){</span><span style="color: #008080;"> 5</span> <span style="color: #800080;">$this</span>->y=<span style="color: #800080;">$v</span><span style="color: #000000;">;</span><span style="color: #008080;"> 6</span> <span style="color: #000000;">}</span><span style="color: #008080;"> 7</span> <span style="color: #000000;">functiongetY(){</span><span style="color: #008080;"> 8</span> <span style="color: #0000ff;">return</span><span style="color: #800080;">$this</span>-><span style="color: #000000;">y;</span><span style="color: #008080;"> 9</span> <span style="color: #000000;">}</span><span style="color: #008080;">10</span> }
"Another"类的对象拥有了父类(Something)的全部的数据成员及方法,而且还加上了自己的数据成员和方法。
你可以使用
<span style="color: #008080;">1</span> <span style="color: #800080;">$obj2</span>=<span style="color: #000000;">newAnother;</span><span style="color: #008080;">2</span> <span style="color: #800080;">$obj2</span>->setY(5<span style="color: #000000;">);</span><span style="color: #008080;">3</span> <span style="color: #0000ff;">echo</span><span style="color: #800080;">$obj2</span>->getY();
PHP只支持单继承,所以你不能从两个或两个以上类派生出新的类来。你可以在派生类中重定义一个方法,如果我们在"Another"类中重定义了getX方法(方法重写),我们就不能使 用"Something"中的getX方法了。如果你在派生类中声明了一个与基派同名的数据成员,那么当你处理它时, 它将“隐藏”基类的数据成员。
你可以在你的类中定义构造函数。构造函数是一个与类名同名的方法,当你创建一个类的对象时会被调用,例如:
<span style="color: #008080;"> 1</span> <span style="color: #000000;">classSomething{</span><span style="color: #008080;"> 2</span> <span style="color: #0000ff;">private</span><span style="color: #800080;">$x</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">;</span><span style="color: #008080;"> 3</span> <span style="color: #008080;"> 4</span> <span style="color: #008000;">//</span><span style="color: #008000;">新版本的构造函数放弃使用类名,而统一使用__construct()</span><span style="color: #008080;"> 5</span> publicfunction__construct(<span style="color: #800080;">$x</span><span style="color: #000000;">){</span><span style="color: #008080;"> 6</span> <span style="color: #800080;">$this</span>->x=<span style="color: #800080;">$x</span><span style="color: #000000;">;</span><span style="color: #008080;"> 7</span> <span style="color: #000000;">}</span><span style="color: #008080;"> 8</span> publicfunctionsetX(<span style="color: #800080;">$v</span><span style="color: #000000;">){</span><span style="color: #008080;"> 9</span> <span style="color: #800080;">$this</span>->x=<span style="color: #800080;">$v</span><span style="color: #000000;">;</span><span style="color: #008080;">10</span> <span style="color: #000000;">}</span><span style="color: #008080;">11</span> <span style="color: #000000;">publicfunctiongetX(){</span><span style="color: #008080;">12</span> <span style="color: #0000ff;">return</span><span style="color: #800080;">$this</span>-><span style="color: #000000;">x;</span><span style="color: #008080;">13</span> <span style="color: #000000;">}</span><span style="color: #008080;">14</span> <span style="color: #008080;">15</span> <span style="color: #008000;">//</span><span style="color: #008000;">析构函数</span><span style="color: #008080;">16</span> <span style="color: #000000;">publicfunction__destruct(){</span><span style="color: #008080;">17</span> <span style="color: #008080;">18</span> <span style="color: #000000;">}</span><span style="color: #008080;">19</span> }
所以你可以创建一个对象,通过:
<span style="color: #800080;">$obj</span>=newSomething(6);
构造函数会自动地把6赋值给数据变量x。构造函数和方法都是普通的PHP函数(”__“两个下划线,魔术方法),所以你可以使用缺省参数。
publicfunction__construct(<span style="color: #800080;">$x</span>="3",<span style="color: #800080;">$y</span>="5"<span style="color: #000000;">){}</span>
接着:
<span style="color: #800080;">$obj</span>=newSomething();<span style="color: #008000;">//</span><span style="color: #008000;">x=3andy=5</span><span style="color: #800080;">$obj</span>=newSomething(8);<span style="color: #008000;">//</span><span style="color: #008000;">x=8andy=5</span><span style="color: #800080;">$obj</span>=newSomething(8,9);<span style="color: #008000;">//</span><span style="color: #008000;">x=8andy=9</span>
缺省参数使用C++的方式,所以你不能忽略Y的值,而给X一个缺省参数,参数是从左到右赋值的,如果传入的参数少于要求的参数时,其作的将使用缺省参数。
当一个派生类的对象被创建时,只有它的构造函数被调用,父类的构造函数没被调用,如果你想调用基类的构造函数,你必须要在派生类的构造函数中用parent::__construct()调用。可以这样做是在派生类中所有父类的方法都是可用的。
<span style="color: #008080;">1</span> <span style="color: #000000;">class Another extends Something{</span><span style="color: #008080;">2</span> <span style="color: #000000;">public function__construct(){</span><span style="color: #008080;">3</span> parent::__construct(5,6);<span style="color: #008000;">//</span><span style="color: #008000;">显示调用基类构造函数</span><span style="color: #008080;">4</span> <span style="color: #000000;">}</span><span style="color: #008080;">5</span> }
OOP的一个很好的机制是使用抽象类。抽象类是不能实例化,只能提供给派生类一个接口。设计者通常使用抽象类来强迫程序员从基类派生,这样可以确保新的类包含一些期待的功能。在PHP中没有标准的方法,但是:如果你需要这个特性,可以通过定义基类,并在它的构造函数后加上"die" 的调用,这样就可以保证基类是不可实例化的,在每一个方法(接口)后面加上"die" 语句,所以,如果一个程序员在派生类中没有覆盖方法,将引发一个错误。而且因为PHP 是无类型的,你可能需要确认一个对象是来自于你的基类的派生类,那么在基类中增加一个方法来实义类的身份(返回某种标识id),并且在你接收到一个对象参数时校验这个值。当然,如果一个不好的邪恶程序员在派生类中覆盖了这个方法,这种方法就不起作用了,不过一般问题多在懒惰的程序员身上,而不是邪恶的程序员。
当然,能够让基类对程序员无法看到是很好的,只要将接口打印出来做他们的工作就可以了。PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。[3]
重载(与覆盖不同)在PHP中不支持,因为PHP是弱类型语言。在OOP中,你可以重载一个方法来实现两个或重多的方法具有相同的名字,但是有不同数量或类型的参数(这要看语言)。PHP 是一种松散类型的语言,所以通过类型重载不起作用,然而通过参数的个数不同来重载也不起作用。
有时在OOP中重载构造函数非常好,这样你可以通过不同的方法创建对象(变量函数)。在PHP中实现它的技巧是:
<span style="color: #008080;"> 1</span> <span style="color: #000000;">class Myclass{</span><span style="color: #008080;"> 2</span> <span style="color: #000000;">public function Myclass(){</span><span style="color: #008080;"> 3</span> <span style="color: #800080;">$name</span>="Myclass".<span style="color: #008080;">func_num_args</span>();<span style="color: #008000;">//</span><span style="color: #008000;">这个函数返回的是传过来参数的个数</span><span style="color: #008080;"> 4</span> <span style="color: #800080;">$this</span>-><span style="color: #800080;">$name</span>();<span style="color: #008000;">//</span><span style="color: #008000;">这里使用的是一个变量函数,以这个变量的值作为函数的名称调用</span><span style="color: #008080;"> 5</span> <span style="color: #000000;">}</span><span style="color: #008080;"> 6</span> public function Myclass1(<span style="color: #800080;">$x</span><span style="color: #000000;">){</span><span style="color: #008080;"> 7</span> <span style="color: #008000;">//</span><span style="color: #008000;">code</span><span style="color: #008080;"> 8</span> <span style="color: #000000;">}</span><span style="color: #008080;"> 9</span> public function Myclass2(<span style="color: #800080;">$x</span>,<span style="color: #800080;">$y</span><span style="color: #000000;">){</span><span style="color: #008080;">10</span> <span style="color: #008000;">//</span><span style="color: #008000;">code</span><span style="color: #008080;">11</span> <span style="color: #000000;">}</span><span style="color: #008080;">12</span> }
通过在类中的额外的处理,使用这个类对用户是透明的:
<span style="color: #008080;">1</span> <span style="color: #800080;">$obj1</span>=newMyclass('1');<span style="color: #008000;">//</span><span style="color: #008000;">将调用Myclass1</span><span style="color: #008080;">2</span> <span style="color: #800080;">$obj2</span>=newMyclass('1','2');<span style="color: #008000;">//</span><span style="color: #008000;">将调用Myclass2</span>
有时这个非常好用。
多态
多态是对象的一种能力,它可以在运行时刻根据传递的对象参数,决定调用哪一个对象的方法。例如,如果你有一个figure的类,它定义了一个draw的方法。并且派生了circle和rectangle 类,在派生类中你覆盖了draw方法,你可能还有一个函数,它希望使用一个参数x,并且可以调用$x->draw()。如果你有多态性,调用哪个draw方法就依赖于你传递给这个函数的对象类型。
多态性在象PHP这样的解释语言(想象一下一个C++编译器生成这样的代码,你应该调用哪一个方法?你也不知道你拥有的对象是什么类型的,好,这不是重点)是非常容易和自然的。所以PHP当然支持多态性。
<span style="color: #008080;"> 1</span> <span style="color: #000000;">classCalc{</span><span style="color: #008080;"> 2</span> functionniceDrawing(<span style="color: #800080;">$x</span>){<span style="color: #008000;">//</span><span style="color: #008000;">假设这是Board类的一个方法</span><span style="color: #008080;"> 3</span> <span style="color: #800080;">$x</span>-><span style="color: #000000;">draw();</span><span style="color: #008080;"> 4</span> <span style="color: #000000;">}</span><span style="color: #008080;"> 5</span> <span style="color: #000000;">}</span><span style="color: #008080;"> 6</span> <span style="color: #008080;"> 7</span> <span style="color: #000000;">classCircle{</span><span style="color: #008080;"> 8</span> <span style="color: #000000;">publicfunctiondraw(){</span><span style="color: #008080;"> 9</span> <span style="color: #0000ff;">echo</span>"画了一个圆"<span style="color: #000000;">;</span><span style="color: #008080;">10</span> <span style="color: #000000;">}</span><span style="color: #008080;">11</span> <span style="color: #000000;">}</span><span style="color: #008080;">12</span> <span style="color: #008080;">13</span> <span style="color: #000000;">classRectangle{</span><span style="color: #008080;">14</span> <span style="color: #000000;">publicfunctiondraw(){</span><span style="color: #008080;">15</span> <span style="color: #0000ff;">echo</span>"画了一个矩形"<span style="color: #000000;">;</span><span style="color: #008080;">16</span> <span style="color: #000000;">}</span><span style="color: #008080;">17</span> <span style="color: #000000;">}</span><span style="color: #008080;">18</span> <span style="color: #800080;">$board</span>=<span style="color: #000000;">newCalc;</span><span style="color: #008080;">19</span> <span style="color: #800080;">$obj</span>=newCircle(3,187<span style="color: #000000;">);</span><span style="color: #008080;">20</span> <span style="color: #800080;">$obj2</span>=newRectangle(4,5<span style="color: #000000;">);</span><span style="color: #008080;">21</span> <span style="color: #800080;">$board</span>->niceDrawing(<span style="color: #800080;">$obj</span>);<span style="color: #008000;">//</span><span style="color: #008000;">将调用Circle的draw方法</span><span style="color: #008080;">22</span> <span style="color: #800080;">$board</span>->niceDrawing(<span style="color: #800080;">$obj2</span>);<span style="color: #008000;">//</span><span style="color: #008000;">将调用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 style="color: #008080;">1</span> <span style="color: #800080;">$obj</span>=<span style="color: #000000;">newClassfoo();</span><span style="color: #008080;">2</span> <span style="color: #800080;">$str</span>=<span style="color: #008080;">serialize</span>(<span style="color: #800080;">$obj</span>);<span style="color: #008000;">//</span><span style="color: #008000;">保存$str到磁盘上</span><span style="color: #008080;">3</span> <span style="color: #800080;">$obj2</span>=<span style="color: #008080;">unserialize</span>(<span style="color: #800080;">$str</span>);<span style="color: #008000;">//</span><span style="color: #008000;">几个月以后//从磁盘中装入str</span>
你恢复了成员数据,但是不包括方法(根据文档所说)。这导致了只能通过类似于使用$obj2->x来存取成员变量(你没有别的方法!)的唯一办法,所以不要在家里试它。
有一些办法可以解决这个问题,我把它留着,因为对这篇简洁的文章来说,他们太不好。我会很高兴地欢迎在PHP的后续版本中有全序列化的特性。
使用类进行数据存储PHP和OOP一件非常好的事情就是,你可以很容易地定义一个类来操作某件事情,并且无论何时你想用的时候都可以调用相应的类。假设你有一个HTML表单,用户可以通过选择产品ID号来选择一个产品。在数据库中有产品的信息,你想把产品显示出来,显示它的价格等等。你拥有不同类型的产品,并且同一个动作可能对不同的产品具有不同的意思。例如,显示一个声音可能意味着播放它,但是对于其它种类的产品可能意味着显示一个存在数据库中的图片。你可以使用OOP或PHP来减少编码并提高质量:
定义一个产品的类,定义它应该有的方法(例如:显示),然后定义对每一种类型的产品的类,从产品类派后出来(SoundItem类,ViewableItem类,等等),覆盖在产品类中的方法,使它们按你的想法动作。
根据数据库中每一种产品的类型(type)字段给类命名,一个典型的产品表可能有(id,type,price,description,等等字段)...然后在处理脚本中,你可以从数据库中取出type值,然后实例化一个名为type的对象:
<span style="color: #008080;">1</span> <span style="color: #800080;">$obj</span>=<span style="color: #0000ff;">new</span><span style="color: #800080;">$type</span><span style="color: #000000;">();</span><span style="color: #008080;">2</span> <span style="color: #800080;">$obj</span>->action();
这是PHP的一个非常好的特性,你可以不用考虑对象的类型,调用$obj的显示方法或其它的方法。使用这个技术,你不需要修改脚本去增加一个新类型的对象,只是增加一个处理它的类。
这个功能很强大,只要定义方法,而不去考虑所有对象的类型,在不同的类中按不同的方法实现它们,然后在主脚本中对任意对象使用它们,没有if...else,也不需要两个程序员,只有高兴。
你同意编程是容易的,维护是便宜的,可重用是真的吗?
如果你管理一组程序员,分配工作就是很简单的了,每个人可能负责一个类型的对象和处理它的类。
可以通过这个技术实现国际化,根据用户所选的语言字段应用相应的类就可以了,等等。
拷贝和克隆
当你创建一个$obj的对象时,你可以通过$obj2=$obj来拷贝对象,新的对象是$obj的一个拷贝(不是一个引用),所以它具有$obj在当时的状态。有时候,你不想这样,你只是想生成一个象obj类一样的一个新的对象,可以通过使用new语句来调用类的构造函数。在PHP中也可以通过序列化,和一个基类来实现,但所有的其它类都要从基类派生出来。
进入危险区域
当你序列化一个对象,你会得到某种格式的字符串,如果你感兴趣,你可以调究它,其中,字符串中有类的名字(太好了!),你可以把它取出来,象:
<span style="color: #008080;">1</span> <span style="color: #800080;">$herring</span>=<span style="color: #008080;">serialize</span>(<span style="color: #800080;">$obj</span><span style="color: #000000;">);</span><span style="color: #008080;">2</span> <span style="color: #800080;">$vec</span>=<span style="color: #008080;">explode</span>(':',<span style="color: #800080;">$herring</span>);<span style="color: #008000;">//</span><span style="color: #008000;">以:为标识符把字符串拆分成一个数组</span><span style="color: #008080;">3</span> <span style="color: #800080;">$nam</span>=<span style="color: #008080;">str_replace</span>("\",'',<span style="color: #800080;">$vec</span>[2]);
所以假设你创建了一个"Universe"的类,并且强制所有的类都必须从universe扩展,你可以在universe 中定义一个clone的方法,如下:
<span style="color: #008080;"> 1</span> <span style="color: #000000;">classUniverse{</span><span style="color: #008080;"> 2</span> <span style="color: #008080;"> 3</span> <span style="color: #008000;">//</span><span style="color: #008000;">在新的PHP版本中克隆(__clone())是一个魔术方法,不要和这个方法搞混了</span><span style="color: #008080;"> 4</span> <span style="color: #008080;"> 5</span> <span style="color: #000000;">functionclone(){</span><span style="color: #008080;"> 6</span> <span style="color: #008080;"> 7</span> <span style="color: #800080;">$herring</span>=<span style="color: #008080;">serialize</span>(<span style="color: #800080;">$this</span><span style="color: #000000;">);</span><span style="color: #008080;"> 8</span> <span style="color: #008080;"> 9</span> <span style="color: #800080;">$vec</span>=<span style="color: #008080;">explode</span>(':',<span style="color: #800080;">$herring</span><span style="color: #000000;">);</span><span style="color: #008080;">10</span> <span style="color: #008080;">11</span> <span style="color: #800080;">$nam</span>=<span style="color: #008080;">str_replace</span>("\"",'',<span style="color: #800080;">$vec</span>[2<span style="color: #000000;">]);</span><span style="color: #008080;">12</span> <span style="color: #008080;">13</span> <span style="color: #800080;">$ret</span>=<span style="color: #0000ff;">new</span><span style="color: #800080;">$nam</span><span style="color: #000000;">;</span><span style="color: #008080;">14</span> <span style="color: #0000ff;">return</span><span style="color: #800080;">$ret</span><span style="color: #000000;">;</span><span style="color: #008080;">15</span> <span style="color: #008080;">16</span> <span style="color: #000000;">}</span><span style="color: #008080;">17</span> <span style="color: #008080;">18</span> }<span style="color: #008000;">//</span><span style="color: #008000;">然后</span><span style="color: #008080;">19</span> <span style="color: #008080;">20</span> <span style="color: #800080;">$obj</span>=newSomething();<span style="color: #008000;">//</span><span style="color: #008000;">从Universe扩展</span><span style="color: #008080;">21</span> <span style="color: #008080;">22</span> <span style="color: #800080;">$other</span>=<span style="color: #800080;">$obj</span>-><span style="color: #0000ff;">clone</span>();
你所得到的是一个新的Something类的对象,它同使用new方法,调用构造函数创建出的对象一样。我不知道这个对你是否有用,但是Universe类可以知道派生类的名字是一个好的经验。想象是唯一的限制。
模板引擎
フレームワークの紹介thinkphp
ThinkPHP は、無料でオープンソースの、高速でシンプルなオブジェクト指向の軽量 PHP 開発フレームワークであり、設立されました。 2006 年初頭に Apache2 オープンソース契約に基づいてリリースされ、アジャイルな WEB アプリケーション開発と簡素化されたエンタープライズ アプリケーション開発のために誕生しました。 ThinkPHP は、誕生以来、シンプルで実用的な設計原則を堅持しており、優れたパフォーマンスと最小限のコードを維持しながら、使いやすさにも重点を置いています。多くの独自機能を備えており、コミュニティチームの積極的な参加により、使いやすさ、拡張性、パフォーマンスの面で継続的に最適化と改善が行われ、中国で最も有力な WEB アプリケーション開発フレームワークに成長しました。多くの典型的なケースにより、商用およびポータル レベルの開発に安定して使用できることが保証されます。
PHP 認定レベル
PHP コースは、初級 (IFE)、中級 (IPE)、上級 (IAE) の 3 つのパートで構成されています。
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 style="color: #008080;">1</span> <span style="color: #0000ff;">if</span>(1==<span style="color: #800080;">$x</span><span style="color: #000000;">){</span><span style="color: #008080;">2</span> <span style="color: #800080;">$indented_code</span>=1<span style="color: #000000;">;</span><span style="color: #008080;">3</span> <span style="color: #0000ff;">if</span>(1==<span style="color: #800080;">$new_line</span><span style="color: #000000;">){</span><span style="color: #008080;">4</span> <span style="color: #800080;">$more_indented_code</span>=1<span style="color: #000000;">;</span><span style="color: #008080;">5</span> <span style="color: #000000;">}</span><span style="color: #008080;">6</span> }
3.变量赋值建议保持相等间距和排列。
例如:
<span style="color: #008080;">1</span> <span style="color: #800080;">$variable</span>='demo'<span style="color: #000000;">;</span><span style="color: #008080;">2</span> <span style="color: #800080;">$var</span>='demo2';
4.每行代码长度应控制在80个字符以内,最长不超过120个字符。因为 linux 读入文件一般以80列为单位,就是说如果一行代码超过80个字符,那么系统将为此付出额外操作指令。这个虽然看起来是小问题,但是对于追求完美的程序员来说也是值得注意并遵守的规范。
5.每行结尾不允许有多余的空格。
Php文件记事本编辑乱码问题
一般情况下,记事本编辑器在对文件进行完编辑并保存之时,其默认编码为ANSI,中文。然则更多的时候,php在语言环境设置时语言多数为utf-8,直接保存并用于apache等http-server解析后就会出现乱码。
为此,应该注意在用记事本编辑完后可将文件用“另存为”的方式对文件进行保存,并将“文件类型”选择“所有文件”,编码与文件指定语言编码一致即可。[4]
算数运算符
PHP 的运算符包括算术运算符、赋值运算符、比较运算符和逻辑运算符。[5]
算数运算符:
加,减,乘,除,取模(取余)
+、-、*、/、%
赋值运算符:(以下解释在许多书中有所不同)
赋值,加赋值,减赋值、乘赋值、除赋值,连字赋值
=、+=、-=、*=、/=、.=
位运算符:
位与、位或、位亦或、位非、左移、右移
&、|、^、~、<<、>>
比较运算符:
等しい、完全に等しい、等しくない、完全に等しくない、より大きい、より小さい、以上、以下、
==、===、!= (< >)、!==、> ;、<、>=、<=
論理演算子:
論理 AND、論理 OR、論理 NOT、論理 OR
&&, || ,!, xor
文字列演算子:
2 つの文字列