PHP強制物件類型之instanceof運運算元(3)

日期:2006-09-28  作者:喜騰小二  來源:PHPChina


四、 延伸"instanceof"運運算元的使用:嵌套(X)HTML
widget


  好。妳已經看到了"instanceof"運運算元在被直接注入到页面生成器類的輸入物件進行類型檢查方麵所表現出的良好功能。現在,我將再進一步來把一個檢查常式新增到(X)HTML
widget類的構造器和"getHTML()"方法中,這樣它們可以接受其它的widget作為輸入參數。請檢查下麵改進的類:

class Div extends HTMLElement{
 private $output='<div ';
 private
$data;
 public function
__construct($attributes=array(),$data){
  if(!$data instanceof
HTMLElement&&!is_string($data)){
   throw new Exception('Invalid
parameter
type');
  }
  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
instanceof
HTMLElement)?
  $this->data->getHTML():$this->data;
  $this->output.='</div>';
  return
$this->output;
 }
}
class Header1 extends HTMLElement{
 private
$output='<h1 ';
 private $data;
 public function
__construct($attributes=array(),$data){
  if(!$data instanceof
HTMLElement&&!is_string($data)){
   throw new Exception('Invalid
parameter
type');
  }
  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
instanceof
HTMLElement)?
  $this->data->getHTML():$this->data;
  $this->output.='</h1>';
  return
$this->output;
 }
}
class Paragraph extends HTMLElement{
 private
$output='<p ';
 private $data;
 public function
__construct($attributes=array(),$data){
  if(!$data instanceof
HTMLElement&&!is_string($data)){
   throw new Exception('Invalid
parameter
type');
  }
  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
instanceof
HTMLElement)?
  $this->data->getHTML():$this->data;
  $this->output.='</p>';
  return
$this->output;
 }
}
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.=($item
instanceof
  HTMLElement)?'<li>'.$item->getHTML().'</li>':'<li>'.$item.'</li>';
 }
 $this->output.='</ul>';
 return
$this->output;
}
}

  如上麵的類所展示的,為了允許在生成相應的網頁時實現嵌套的(X)HTML元素,我分別重構了它們的構造器和"getHTML()"方法。請注意,我在每一個類的構造器中包含了下麵的條件塊:

if(!$data instanceof HTMLElement&&!is_string($data)){
throw new
Exception('Invalid parameter
type');
}

  至此,我實際做的是確保僅有字串資料和"HTMLElement"類型物件允許作為每一個類的輸入參數。否則,將分別由各自方法抛出一個異常,並且有可能導緻應用程式的停止執行。所以,這就是對輸入資料的檢查過程。現在,讓我們看一下"getHTML()"方法的新的簽章,其中也使用了"instanceof"運運算元:

$this->output.=($this->data instanceof
HTMLElement)?$this->data-
>getHTML():$this->data;

  如妳所見,在這種情況下,對於利用(X)HTML
widget類的多態性特徵方麵this運運算元是非常有用的。如果$data內容也是一個widget,那麼它的"getHTML()"方法將被正確調用,這會導緻顯示嵌套的網頁元素。另一方麵,如果它僅是一個字串,那麼它就被直接新增到當前類的所有輸出上。

  至此,為了確保某些物件屬於一個特定的類型,妳可能已經理解了PHP
5中"instanceof"運運算元的用法。正如妳在本文中所見,在PHP
5中強制物件類型其實是一個相當直接的工作。現在,妳最好開發一個使用這個方法來篩選妳的PHP應用程式中的物件的例子來加深自己的理解。

  五、小結

  在本文中,妳學習了如何使用PHP
5中的"instanceof"運運算元來檢查妳的輸入物件的類型;然而,我所嚮妳展示的方法不是唯一的。在後麵的一篇中,我將嚮妳解釋怎樣實現PHP
5中的良好的"類型提示"特徵,這是實現強制物件類型的另外一種方法。


<<<返回技術中心

技術文章

站內新聞

我要啦免费统计