由於工作中要用到php,最近下了本《php5 power programming》在讀,外文的,還不錯,打算寫些讀書心得,可能會零散些。這次講的是多型。
首先看乙個例子,是講動物發出的叫聲的。
class cat
} class dog
} function printtherightsound($obj)
else if ($obj instanceof dog) else
print "\n";
} printtherightsound(new cat());
printtherightsound(new dog());
這裡輸出的是:
miau(貓的叫聲)
wuff(狗的叫聲)
熟悉oop的都知道,這個例子擴充套件性不好,因為如果你要加入更多動物的話,需要用很多個if else來判斷,而且要重複寫很多**,有了多型後,就好辦了。php5中終於有多型這東西了,多個子類可以擴充套件繼承父類,上面的例子改寫如下:
class animal
} class cat extends animal
} class dog extends animal
} function printtherightsound($obj)
else
print "\n";
} printtherightsound(new cat());
printtherightsound(new dog());
可以看出,這個時候,無論增加什麼動物,printtherightsound方法是不需要 進行任何修改的了!當然,大家學過oop的可以看出,這個例子可以進一步修改,就是將animal宣告為抽象基類拉。
在oop中,建構函式和析構函式是很重要的,在php4中,可以用和類名相同的方法名稱來宣告建構函式,比如
class a
} 在php5中,是用新的關鍵字_construct來實現了,而析構函式則用__destruct()
比如乙個例子:
class person
function getname()
private $name;
}; $judy = new person("judy") . "\n";
$joe = new person("joe") . "\n";
print $judy->getname();
print $joe->getname();
今天講的是parent::和self::兩個新的關鍵字。self是用來引用當前類並且一般用來訪問靜態成員變數,parent::用來訪問父類,並且一般用來訪問父類的建構函式或者方法。有oop知識的朋友其實很容易理解,以下是例子:
class ancestor
} class child extends ancestor
} $obj = new child();
輸出是:
in ancestor constructor
in child constructor
1 instanceof操作
該操作中,判斷某個類是否是另乙個類的子類或判斷是否類的例項。比如考察下面的例子
class rectangle
class square extends rectangle
class circle
function checkifrectangle($shape) }
checkifrectangle(new square());
checkifrectangle(new circle());
其中square類繼承了rectangle類,而circle類則是單獨的。那麼,在checkifrectangle中,判斷傳入來的類是否rectangle的子類。結果輸出是'square is a rectangle\n'.
其中,_class_是乙個特殊的常量,表示的是當前類的名稱。
2 抽象類和介面
抽象類中,只定義了方法的宣告部分,而具體的實現是留給其子類去實現的。比如有如下的例子:
abstract class shape
abstract function draw();
protected $x, $y;
} class square extends shape
} class circle extends shape
} 其中,形狀類是基類,宣告了抽象的方法draw,因為不同的圖形有不同的「畫」的方法。接下來square和circle類都繼承了shape類, 並且各自實現了自己的draw方法。
當乙個抽象類的所有方法都是抽象的,那麼可以用介面來定義了。本質上來說,介面是一種特殊的抽象類,抽象類中只包含常量和方法的定義,而沒有變數和方法的實現。
比如下面的例子:
其中宣告了介面loggable,接下來person和product類都實現了其介面,但類a是單獨的,沒實現其介面,於是在主程式mylog中,分別判斷各物件是否loggable的子類。當然,對a,是輸出出錯資訊的。
3 _autoload()功能
我們在寫oop時,經常是這樣的,先比如在乙個目錄,如include下,先寫了很多個基本的類,然後在其他要應用這些類的程式中,用include("***/***x.php")的功能,來引入這些類。當工程很大時,有的時候經常會忘記include正確的類檔案進來了,而且很容易出錯。在php5中,增添了_autoload()功能了,比如乙個例子如下
myclass.php
<?php
class myclass
} general.inc:
<?php
function __autoload($class_name)
main.php:
<?php
require_once "general.inc";
$obj = new myclass();
$obj->printhelloworld();
?>
其中,假設在/classes目錄下,每個類假設以同名的方式命名php檔案,如乙個叫a的類,以a.php檔案來命名。在上面的例子中,在main.php中,沒有顯式生命類myclass,但是require了general.inc,在這個inc檔案中,使用了_autoload方法,自動去classes目錄下,找相應的類,這裡找到了myclass.php了。看,這樣就很方便了,不需要在main.php中,大量寫很多的include了,太方便拉
inte***ce loggable
class person implements loggable
} class product implements loggable
} class a }
function mylog($obj) else
} $person = new person();
// ...
$product = new product();
$a=new a();
mylog($person);
mylog($product);
mylog($a);
php5 讀書心得(1)
由於工作中要用到php,最近下了本 php5 power programming 在讀,外文的,還不錯,打算寫些讀書心得,可能會零散些。這次講的是多型。首先看乙個例子,是講動物發出的叫聲的。class cat class dog function printtherightsound obj els...
PHP5配置選項
在unix平台上安裝基本沒有變化 1.gunzip 5.x.x.tar.gz 2.tar xvf 5.x.x.tar 3.cd 5.x.x 4.configure 5.make 6.make install 7.apachectl restart configure 配置命令取決於安裝步驟可能需要另...
php5安裝詳解
對於apache2的設定 1 不要addmodule mod php5.c 2 loadmodule php5 module c php php5apache2.dll,是php5apache2.dll 3 需要將php目錄下的dll檔案 以下檔案不必複製 php5activescript.dll ...