PHP编程:PHP强迫对象类型之instanceof操作符
培训的第四阶段,就是应用PHP语言开发实际的程序。以结合实际的项目开发来进行学习,效果真的很好,在学习完之后就开始练习,能比较容易掌握所学的知识,这是学校的学习所没法比的。对象 1、简介在PHP中完成强迫对象类型有时能够十分主要。假如短少了它,或是由于缺少这方面的常识――基于不准确的编程假定,或仅仅是因为怠惰,那末你会在特定的Web使用法式中看到你所不但愿的了局。出格是当用PHP 4停止编程时,利用"is_a()"函数(虽然还有其它办法)来验证你所利用的对象的类型长短常轻易的工作。毫无疑问,强迫对象类型还可以被用于过滤输出对象(需求被作为参数传递到统一个使用法式中的其它PHP类)。
不外,PHP 4并没有表露一些有关于它的对象模子的弱点-为了完成某些在成熟的面向对象的言语中呈现的特点,它偶而能够请求编写别的的代码。长工夫以来,这一现实已为PHP社区尽人皆知。但是,跟着PHP 5的刊行,很多这些极有价值的特点作为改善的对象模子的一局部被添加到个中。它们将有助于更加严密地完成基于对象的代码的开辟-答应你利用特定的对象特点。
在下面的情形下,当触及到对象类型强迫时应当出格注重。实践上,在一个Web使用法式的履行时代,PHP 5供应给开辟者最少两种办法来反省对象类型――它们分离是“instanceof”操作符和“类型提醒”特点。如今转到本文的主题,我将引见PHP 5中"instanceof"操作符的利用;你很快就会发明,它可以十分便利地用来肯定是不是你正在利用的对象属于一个特定的类型。
本文将经由过程一些面向对象的示例来匡助你了解若何在PHP 5中完成强迫对象类型。
2、 你不应做甚么
为了展现在PHP 5中若何完成对象类型强迫,我将利用(X)HTML widget类,还有一个复杂的页面熟成器类,并作了复杂的修正以合适PHP 5开辟情况。
我的第一个示例罗列了一些派生自一个笼统的基类"HTMLElement"的(X)HTML widget类,它跳过了到它们的输出对象类型的反省。请先看上面的类:
//界说笼统类'HTMLElement'
abstract class HTMLElement{
protected $attributes;
protected function __construct($attributes){
if(!is_array($attributes)){
throw new Exception('Invalid attribute type');
}
$this->attributes=$attributes;
}
// 笼统的'getHTML()'办法
abstract protected function getHTML();
}
//界说详细的类'Div'-扩大HTMLElement
class Div extends HTMLElement{
private $output='<div ';
private $data;
public function __construct($attributes=array(),$data){
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.'</div>';
return $this->output;
}
}
//界说详细类'Header1'-扩大HTMLElement
class Header1 extends HTMLElement{
private $output='<h1 ';
private $data;
public function __construct($attributes=array(),$data){
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.'</h1>';
return $this->output;
}
}
//界说详细类'Paragraph'-扩大HTMLElement
class Paragraph extends HTMLElement{
private $output='<p ';
private $data;
public function __construct($attributes=array(),$data){
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.'</p>';
return $this->output;
}
}
//界说详细类'UnorderedList'-扩大HTMLElement
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.='<li>'.$item.'</li>';
}
$this->output.='</ul>';
return $this->output;
}
}
如你所见,下面的(X)HTML widget类在生成一个网面中特定的元素时长短常有效的,然而我成心地把每个类的代码写成如许,如许它们就不克不及够验证输出参数的无效性。你能够已想到,输出参数将直接被传递到类机关器中而且作为属性赋值。成绩呈现了:如许做有甚么毛病吗?是的,有。如今,我将界说我的最复杂的页面熟成器类,而且用如许一些widget来填充(feed)它,如许你就能够看到这个类的输出是若何与不准确的对象相混同。上面是该页面熟成器类的签名:
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){
$this->output.=$htmlElement->getHTML();
}
public function doFooter(){
$this->output.='</body></html>';
}
public function fetchHTML(){
return $this->output;
}
}
如今,咱们入手下手实例化一些(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($h1);
$pageGen->addHTMLElement($div);
$pageGen->addHTMLElement($par);
$pageGen->addHTMLElement($ul);
$pageGen->doFooter();
//显示网面
echo $pageGen->fetchHTML();
}
catch(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"操作符的威力地点。假如你想要看一下这个操作符是若何利用的,请持续往下读吧。
下一页
可以在书上很方便地做标记,及时记下自己的心得体会。 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 兴趣是最好的老师,百度是最好的词典。 在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、 其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎 这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己 本文当是我的笔记啦,遇到的问题随时填充 做为1门年轻的语言,php一直很努力。 写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。 我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。 有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。 如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了, 我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。 要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。 写的比较杂,因为我也是个新手,不当至于大家多多指正。 如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了, 对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。 真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎, 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。
页:
[1]
2