"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 //定义一个抽像类HTMLElement abstract class HTMLElement { protected $attributes; protected function construct($_attributes) { if(!is_array($_attributes)) { throw new Exception("attributes not is array"); } $this->attributes = $_attributes; } //定义一个虚函数 abstract function getHTML(); } //定义具体的类"Div"扩展HTMLElement class Div extends HTMLElement { private $_output = "<div"; private $_data; public function construct($_attributes=array(), $data) { //扩展"instanceof"操作符的使用:嵌套(X)HTML widget if(!$data instanceof HTMLElement && !is_string($data)) { throw new Exception("data type error"); } parent::construct($_attributes); $this->_data = $data; } public function getHTML() { foreach ($this->attributes as $key=>$val) { $this->_output.= " ".$key."='".$val."' "; } $this->_output =substr_replace($this->_output,">",-1); $this->_output .= $this->_data instanceof HTMLElement ? $this->_data->getHTML()."</div>" : $this->_data."</div>"; return $this->_output; } } //定义具体的类"H1"扩展 class h1 extends HTMLElement { private $_output="<h1"; private $_data; public function construct($_attributes=array(), $data) { parent::construct($_attributes); $this->_data = $data; } public function getHTML() { foreach($this->attributes as $key=>$val) { $this->_output.= " ".$key."='".$val."' "; } $this->_output = substr_replace($this->_output, ">", -1); $this->_output .= $this->_data."<h1>"; return $this->_output; } } //定义具体的类"ul" class ul extends HTMLElement { public $output = "<ul"; private $ulitem=array(); public function construct($_attributes=array(), $_ulitem=array()) { parent::construct($_attributes); $this->ulitem = $_ulitem; } public function getHTML() { foreach($this->attributes as $key=>$val) { $this->_output.= " ".$key."='".$val."' "; } $this->output = substr_replace($this->output, ">",-1); foreach($this->ulitem as $ukey=>$uval){ $this->output .="<li>".$uval."</li>"; } $this->output.="</ul>"; return $this->output; } } //生成页面的类 class PageGenerator { private $_output; private $_title; public function construct($title=" Default page") { $this->_title = $title; } public function doHead() { $this->_output.="<html><head><title>".$this->_title."</title></head><body>"; } // public function addHTMLElement($HTMLElement) // { // $this->_output.= $HTMLElement->getHTML(); // } //对addHTMLElement进行改进 //可以保证传入的不是HTMLElement类对像直接报错 public function addHTMLElement($HTMLElement) { if(!$HTMLElement instanceof HTMLElement) { throw new Exception('Invalid (X)HTML element'); } $this->_output.= $HTMLElement->getHTML(); } public function doFooter() { $this->_output.="</body></html>"; } public function fetchHTML() { return $this->_output; } } try{ $attribute = array("class"=>"className", "style"=>"color:#000"); $h1 = new H1($attribute, "h1内容"); $attribute = array("class"=>"className", "style"=>"color:#000"); $ul = new ul($attribute, array("li第一行内容","li第二行内容","li第三行内容")); $attribute = array("class"=>"className", "style"=>"color:red"); $div = new Div($attribute, $ul); $page = new PageGenerator(); // $str="我是个字符串"; // $page->addHTMLElement($str); $page->addHTMLElement($h1); $page->addHTMLElement($div); // $page->addHTMLElement($ul); echo $page->fetchHTML(); } catch(Exception $e){ echo $e->getMessage(); die(); } ?>
以上是php類型運算子'instanceof'操作符的擴充使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!