时间: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网其它相关文章!