Heim php教程 php手册 PHP强制对象类型之instanceof操作符

PHP强制对象类型之instanceof操作符

Jun 21, 2016 am 09:11 AM
attributes function output this

对象

一、简介

  在PHP中实现强制对象类型有时可能非常重要。如果缺少了它,或是因为缺乏这方面的知识——基于不正确的编程假设,或者仅仅是由于懒惰,那么你会在特定的Web应用程序中看到你所不希望的结果。特别是当用PHP 4进行编程时,使用"is_a()"函数(尽管还有其它方法)来验证你所使用的对象的类型是非常容易的事情。毫无疑问,强制对象类型还可以被用于过滤输入对象(需要被作为参数传递到同一个应用程序中的其它PHP类)。

  不过,PHP 4并没有暴露一些有关于它的对象模型的弱点-为了实现某些在成熟的面向对象的语言中出现的特征,它偶而可能要求编写另外的代码。长时间以来,这一事实已经为PHP社区众所周知。然而,随着PHP 5的发行,许多这些极有价值的特征作为改进的对象模型的一部分被添加到其中。它们将有助于更为紧密地实现基于对象的代码的开发-允许你使用特定的对象特征。

  在上面的情况下,当涉及到对象类型强制时应该特别注意。实际上,在一个Web应用程序的执行期间,PHP 5提供给开发者至少两种方法来检查对象类型——它们分别是“instanceof”操作符和“类型提示”特征。现在转到本文的主题,我将介绍PHP 5中"instanceof"操作符的使用;你很快就会发现,它可以非常方便地用来确定是否你正在使用的对象属于一个特定的类型。

  本文将通过一些面向对象的示例来帮助你理解如何在PHP 5中实现强制对象类型。

  二、 你不该做什么

  为了展示在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"操作符的威力所在。如果你想要看一下这个操作符是如何使用的,请继续往下读吧。

[1] [2] 下一页  



Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was bedeutet Funktion? Was bedeutet Funktion? Aug 04, 2023 am 10:33 AM

Funktion bedeutet Funktion. Es handelt sich um einen wiederverwendbaren Codeblock mit bestimmten Funktionen. Er kann Eingabeparameter akzeptieren, bestimmte Operationen ausführen und Ergebnisse zurückgeben. Code, um die Wiederverwendbarkeit und Wartbarkeit des Codes zu verbessern.

Wie verwende ich Attribute zum Verwalten von Codeanmerkungen in PHP8? Wie verwende ich Attribute zum Verwalten von Codeanmerkungen in PHP8? Oct 18, 2023 am 09:48 AM

Wie verwende ich Attribute zum Verwalten von Codeanmerkungen in PHP8? Mit der Veröffentlichung von PHP8 wurde eine aufregende neue Funktion eingeführt, nämlich Attribute. Attribute sind eine Methode zur Codeannotation, die es uns ermöglicht, Metadaten auf strukturierte Weise zu Klassen, Methoden und Attributen hinzuzufügen. In diesem Artikel untersuchen wir, wie man Attribute zum Verwalten von Codeanmerkungen in PHP8 verwendet, und stellen einige spezifische Codebeispiele bereit. 1. Was ist Attribut?

Was ist der Zweck der Funktion „enumerate()' in Python? Was ist der Zweck der Funktion „enumerate()' in Python? Sep 01, 2023 am 11:29 AM

In diesem Artikel lernen wir die Funktion enumerate() und den Zweck der Funktion „enumerate()“ in Python kennen. Was ist die Funktion enumerate()? Die Funktion enumerate() von Python akzeptiert eine Datensammlung als Parameter und gibt ein Aufzählungsobjekt zurück. Aufzählungsobjekte werden als Schlüssel-Wert-Paare zurückgegeben. Der Schlüssel ist der Index, der jedem Element entspricht, und der Wert sind die Elemente. Syntax enumerate(iterable,start) Parameter iterable – Die übergebene Datensammlung kann als Aufzählungsobjekt namens iterablestart zurückgegeben werden – Wie der Name schon sagt, wird der Startindex des Aufzählungsobjekts durch start definiert. wenn wir es ignorieren

Detaillierte Erläuterung der Rolle und Funktion der MySQL.proc-Tabelle Detaillierte Erläuterung der Rolle und Funktion der MySQL.proc-Tabelle Mar 16, 2024 am 09:03 AM

Detaillierte Erläuterung der Rolle und Funktion der MySQL.proc-Tabelle. MySQL ist ein beliebtes relationales Datenbankverwaltungssystem. Wenn Entwickler MySQL verwenden, müssen sie häufig gespeicherte Prozeduren erstellen und verwalten. Die MySQL.proc-Tabelle ist eine sehr wichtige Systemtabelle. Sie speichert Informationen zu allen gespeicherten Prozeduren in der Datenbank, einschließlich des Namens, der Definition, der Parameter usw. der gespeicherten Prozeduren. In diesem Artikel erklären wir ausführlich die Rolle und Funktionalität der MySQL.proc-Tabelle

Wie verwende ich Attribute, um benutzerdefinierte Anmerkungen zu Klassen in PHP8 hinzuzufügen? Wie verwende ich Attribute, um benutzerdefinierte Anmerkungen zu Klassen in PHP8 hinzuzufügen? Oct 18, 2023 am 10:16 AM

Wie verwende ich Attribute, um benutzerdefinierte Anmerkungen zu Klassen in PHP8 hinzuzufügen? Benutzerdefinierte Annotationen sind eine Möglichkeit, einer Klasse oder Methode Metadaten hinzuzufügen, die uns dabei helfen können, zur Laufzeit zusätzliche Informationen zu einer bestimmten Klasse oder Methode zu erhalten und zu verarbeiten. In PHP8 wurde das Konzept der Attribute eingeführt, das uns das einfache Hinzufügen benutzerdefinierter Anmerkungen zu Klassen ermöglicht. In diesem Artikel wird erläutert, wie Sie mithilfe von Attributen benutzerdefinierte Annotationen für Klassen in PHP8 implementieren, und es werden spezifische Codebeispiele bereitgestellt. In PHP8, seitdem

Front-End-Ausgabeeinstellungen Front-End-Ausgabeeinstellungen Feb 19, 2024 am 09:30 AM

Die Front-End-Ausgabekonfiguration erfordert spezifische Codebeispiele. In der Front-End-Entwicklung ist die Ausgabekonfiguration eine sehr wichtige Konfiguration. Es wird verwendet, um den Dateipfad, den Dateinamen und die zugehörigen Ressourcenpfade zu definieren, die nach dem Packen des Projekts generiert werden. In diesem Artikel werden die Rolle der Front-End-Ausgabekonfiguration, allgemeine Konfigurationsoptionen und spezifische Codebeispiele vorgestellt. Die Rolle der Ausgabekonfiguration: Das Ausgabekonfigurationselement wird verwendet, um den Dateipfad und den Dateinamen anzugeben, die nach dem Packen des Projekts generiert werden. Es bestimmt die endgültige Ausgabe des Projekts. Verpackt in Webpack usw.

Die Verwendung und Funktion der Vue.use-Funktion Die Verwendung und Funktion der Vue.use-Funktion Jul 24, 2023 pm 06:09 PM

Verwendung und Funktion von Vue.Funktion verwenden Vue ist ein beliebtes Frontend-Framework, das viele nützliche Features und Funktionen bietet. Eine davon ist die Vue.use-Funktion, die es uns ermöglicht, Plugins in Vue-Anwendungen zu verwenden. In diesem Artikel werden die Verwendung und Funktion der Vue.use-Funktion vorgestellt und einige Codebeispiele bereitgestellt. Die grundlegende Verwendung der Vue.use-Funktion ist sehr einfach. Rufen Sie sie einfach auf, bevor Vue instanziiert wird, und übergeben Sie das Plugin, das Sie verwenden möchten, als Parameter. Hier ist ein einfaches Beispiel: //Plugin vorstellen und verwenden

Was ist die Verwendung der js-Funktion? Was ist die Verwendung der js-Funktion? Oct 07, 2023 am 11:25 AM

Die Verwendung der js-Funktion ist: 1. Funktion deklarieren; 3. Funktionsparameter; 6. Funktion als Parameter;

See all articles