时间:2021-07-01 10:21:17 帮助过:22人阅读
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"操作符的扩展使用的详细内容,更多请关注Gxl网其它相关文章!