,在上面的类中,为了确定所有传递的对象是早些时候定义的"HTMLElement"类的实例,"instanceof"操作符是如何包含在"addHTMLElement()"方法中的。现在,有可能重新构建你前面看到的网页,在这种情况下,请确保所有的传递到该网页生成器类的输入对象都是真正的(X)HTML widget对象。下面是相应示例:
try{ //生成一些HTML元素 $h1=new Header1(array(''name''=>''header1'',''class''=>''headerclass''),''Content for H1 element goes here''); $div=new Div(array(''name''=>''div1'',''class''=>''divclass''),''Content for Div element goes here''); $par=new Paragraph(array(''name''=>''par1'',''class''=>''parclass''),''Content for Paragraph element goes here''); $teststr=''This is not a HTML element''; //实例化页面生成器类 $pageGen=new Page生成器(); $pageGen->doHeader(); //添加''HTMLElement''对象 $pageGen->addHTMLElement($teststr) //把简单的字符串传递到这个方法 $pageGen->addHTMLElement($h1); $pageGen->addHTMLElement($div); $pageGen->addHTMLElement($par); $pageGen->doFooter(); //显示网页 echo $pageGen->fetchHTML(); } catch(Exception $e){ echo $e->getMessage(); exit(); }
正如你在上面的示例已经看到的,我把一个简单的测试用字符串(并不是一个"HTMLElement"对象)传递到该页面生成器类中,这将通过addHTMLElement()"方法抛出一个异常-为特定的"catch"块所捕获,如下所示:
Invalid (X)HTML element
此时,为了确定输入对象的有效性,我使用了"instanceof"操作符,这样以来,可以把上面的网页生成器类转换成一部分更为有效的代码片断。我希望你能真正体会到,通过使用这个操作符,对你的类的方法的输入进行过滤的极端重要性,这样就可以免除外来的不正确的数据输入。
在展示了"instanceof"操作符在网页生成器类内的正确实现后,还有更多的事情要做。类似于我在前面一篇文章中为PHP 4所编写的(X)HTML widget类,我想包含这个操作符作为它们的"getHTML()"方法的一部分,这样就可以允许创建生成嵌套的(X)HTML元素的网页。下面,让我们讨论这是如何实现的。
四、 扩展"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(!$dat |