atch(Exception $e){ echo $e->getMessage(); exit(); }
在运行上面的PHP代码后,你所得到的结果是一个简单的网页-它包含一些前面创建的(X)HTML对象。这种情况下,如果因某些原因该网页生成器类收到一个不正确的对象并调用它的"addHTML()"方法,那么你很容易理解将会发生的事情。在此,我重新修改了这里的冲突条件-通过使用一个不存在的(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''); $ul=new UnorderedList(array (''name''=>''list1'',''class''=>''listclass''),array (''item1''=>''value1'',''item2''=>''value2'',''item3''=>''value3'')); //实例化页面生成器类 $pageGen=new Page生成器(); $pageGen->doHeader(); //添加''HTMLElement''对象 $pageGen->addHTMLElement($fakeobj) //把并不存在的对象传递 到这个方法 $pageGen->addHTMLElement($div); $pageGen->addHTMLElement($par); $pageGen->addHTMLElement($ul); $pageGen->doFooter(); // 显示网面 echo $pageGen->fetchHTML(); } catch(Exception $e){ echo $e->getMessage(); exit(); }
在这种情况中,如下面一行所显示的:
$pageGen->addHTMLElement($fakeobj)//把不存在的对象传递到这个方法
一个并不存在的(X)HTML widget对象被传递到该页面生成器类,这样会导致一个致命性错误:
Fatal error: Call to a member function on a non-object in path/to/file
怎么样?这就是对传递到生成器类的对象的类型不进行检查的直接惩罚!因此在编写你的脚本时一定要记住这个问题。幸好,还有一个简单的方案来解决这些问题,而且这也正是"instanceof"操作符的威力所在。如果你想要看一下这个操作符是如何使用的,请继续往下读吧。
三、 使用"instanceof"操作符
如你所见,"instanceof"操作符的使用非常简单,它用两个参数来完成其功能。第一个参数是你想要检查的对象,第二个参数是类名(事实上是一个接口名),用于确定是否这个对象是相应类的一个实例。当然,我故意使用了上面的术语,这样你就可以看到这个操作符的使用是多么直观。它的基本语法如下:
if (object instanceof class name){ //做一些有用的事情 }
现在,既然你已经了解了这个操作符在PHP 5是如何使用的,那么,为了验证被传递到它的"addHTMLElement()"方法的对象的类型,让我们再定义相应的网页生成器类。下面是这个类的新的签名,我在前面已经提到,它使用了"instanceof"操作符:
class PageGenerator{ private $output=''''; private $title; public function __construct($title="Default Page"){ $this->title=$title; } public function doHeader(){ $this->output=''<html><head><title>''.$this->title.''</title></head><body>''; } 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; } }
请注意 |