一、簡介
在PHP中實現強制對象類型有時可能非常重要。如果缺少了它,或是因為缺乏這方面的知識——基於不正確的編程假設,或者僅僅是由於懶惰,那麼你會在特定的Web應用程序中看到你所不希望的結果。特別是當用PHP 4進行編程時,使用"is_a()"函數(盡管還有其它方法)來驗證你所使用的對象的類型是非常容易的事情。毫無疑問,強制對象類型還可以被用於過濾輸入對象(需要被作為參數傳遞到同一個應用程序中的其它PHP類)。
不過,PHP 4並沒有暴露一些有關於它的對象模型的弱點-為了實現某些在成熟的面向對象的語言中出現的特征,它偶而可能要求編寫另外的代碼。長時間以來,這一事實已經為PHP社區眾所周知。然而,隨著PHP 5的發行,許多這些極有價值的特征作為改進的對象模型的一部分被添加到其中。它們將有助於更為緊密地實現基於對象的代碼的開發-允許你使用特定的對象特征。
在上面的情況下,當涉及到對象類型強制時應該特別注意。實際上,在一個Web應用程序的執行期間,PHP 5提供給開發者至少兩種方法來檢查對象類型——它們分別是“instanceof”操作符和“類型提示”特征。現在轉到本文的主題,我將介紹PHP 5中"instanceof"操作符的使用;你很快就會發現,它可以非常方便地用來確定是否你正在使用的對象屬於一個特定的類型。
本文將通過一些面向對象的示例來幫助你理解如何在PHP 5中實現強制對象類型。
二、 你不該做什麼
為了展示在PHP 5中如何實現對象類型強制,我將使用(X)HTML widget類,還有一個簡單的頁面生成器類,並作了簡單的修改以適合PHP 5開發環境。
我的第一個示例列舉了一些派生自一個抽象的基類"HTMLElement"的(X)HTML widget類,它跳過了到它們的輸入對象類型的檢查。請先看下面的類:
//定義抽象類'HTMLElement'
abstract class HTMLElement{
protected $attributes;
protected function __construct($attributes){
if(!is_array($attributes)){
throw new Exception('Invalid attribute type');
}
$this->attributes=$attributes;
}
// 抽象的'getHTML()'方法
abstract protected function getHTML();
}
//定義具體的類'Div'-擴展HTMLElement
class Div extends HTMLElement{
private $output='<div ';
private $data;
public function __construct($attributes=array(),$data){
parent::__construct($attributes);
$this->data=$data;
}
//'getHTML()'方法的具體實現
public function getHTML(){
foreach($this->attributes as $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
}
$this->output=substr_replace($this->output,'>',-1);
$this->output.=$this->data.'</div>';
return $this->output;
}
}
//定義具體類'Header1'-擴展HTMLElement
class Header1 extends HTMLElement{
private $output='<h1 ';
private $data;
public function __construct($attributes=array(),$data){
parent::__construct($attributes);
$this->data=$data;
}
//'getHTML()'方法的具體的實現
public function getHTML(){
foreach($this->attributes as $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
}
$this->output=substr_replace($this->output,'>',-1);
$this->output.=$this->data.'</h1>';
return $this->output;
}
}
//定義具體類'Paragraph'-擴展HTMLElement
class Paragraph extends HTMLElement{
private $output='<p ';
private $data;
public function __construct($attributes=array(),$data){
parent::__construct($attributes);
$this->data=$data;
}
//'getHTML()'方法的具體實現
public function getHTML(){
foreach($this->attributes as $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
}
$this->output=substr_replace($this->output,'>',-1);
$this->output.=$this->data.'</p>';
return $this->output;
}
}
//定義具體類'UnorderedList'-擴展HTMLElement
class UnorderedList extends HTMLElement{
private $output='<ul ';
private $items=array();
public function __construct($attributes=array(),$items=array()){
parent::__construct($attributes);
if(!is_array($items)){
throw new Exception('Invalid parameter for list items');
}
$this->items=$items;
}
//'getHTML()'方法的具體實現
public function getHTML(){
foreach($this->attributes as $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
}
$this->output=substr_replace($this->output,'>',-1);
foreach($this->items as $item){
$this->output.='<li>'.$item.'</li>';
}
$this->output.='</ul>';
return $this->output;
}
}