国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 php教程 php手冊 PHP強制對象類型之instanceof操作符

PHP強制對象類型之instanceof操作符

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

對象

一、簡介

  在PHP中實現(xiàn)強制對象類型有時可能非常重要。如果缺少了它,或是因為缺乏這方面的知識——基于不正確的編程假設(shè),或者僅僅是由于懶惰,那么你會在特定的Web應用程序中看到你所不希望的結(jié)果。特別是當用PHP 4進行編程時,使用"is_a()"函數(shù)(盡管還有其它方法)來驗證你所使用的對象的類型是非常容易的事情。毫無疑問,強制對象類型還可以被用于過濾輸入對象(需要被作為參數(shù)傳遞到同一個應用程序中的其它PHP類)。

  不過,PHP 4并沒有暴露一些有關(guān)于它的對象模型的弱點-為了實現(xiàn)某些在成熟的面向?qū)ο蟮恼Z言中出現(xiàn)的特征,它偶而可能要求編寫另外的代碼。長時間以來,這一事實已經(jīng)為PHP社區(qū)眾所周知。然而,隨著PHP 5的發(fā)行,許多這些極有價值的特征作為改進的對象模型的一部分被添加到其中。它們將有助于更為緊密地實現(xiàn)基于對象的代碼的開發(fā)-允許你使用特定的對象特征。

  在上面的情況下,當涉及到對象類型強制時應該特別注意。實際上,在一個Web應用程序的執(zhí)行期間,PHP 5提供給開發(fā)者至少兩種方法來檢查對象類型——它們分別是“instanceof”操作符和“類型提示”特征?,F(xiàn)在轉(zhuǎn)到本文的主題,我將介紹PHP 5中"instanceof"操作符的使用;你很快就會發(fā)現(xiàn),它可以非常方便地用來確定是否你正在使用的對象屬于一個特定的類型。

  本文將通過一些面向?qū)ο蟮氖纠齺韼椭憷斫馊绾卧赑HP 5中實現(xiàn)強制對象類型。

  二、 你不該做什么

  為了展示在PHP 5中如何實現(xiàn)對象類型強制,我將使用(X)HTML widget類,還有一個簡單的頁面生成器類,并作了簡單的修改以適合PHP 5開發(fā)環(huán)境。

  我的第一個示例列舉了一些派生自一個抽象的基類"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()'方法的具體實現(xiàn)
 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()'方法的具體的實現(xiàn)
 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()'方法的具體實現(xiàn)
 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()'方法的具體實現(xiàn)
 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類在生成一個網(wǎng)面中特定的元素時是非常有用的,但是我有意地把每一個類的代碼寫成這樣,這樣它們就不能夠驗證輸入?yún)?shù)的有效性。你可能已經(jīng)想到,輸入?yún)?shù)將直接被傳遞到類構(gòu)造器中并且作為屬性賦值。問題出現(xiàn)了:這樣做有什么錯誤嗎?是的,有?,F(xiàn)在,我將定義我的最簡單的頁面生成器類,并且用這樣一些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;
 }
}
  現(xiàn)在,我們開始實例化一些(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();
 //顯示網(wǎng)面
 echo $pageGen->fetchHTML();
}
catch(Exception $e){
 echo $e->getMessage();
 exit();
}
  在運行上面的PHP代碼后,你所得到的結(jié)果是一個簡單的網(wǎng)頁-它包含一些前面創(chuàng)建的(X)HTML對象。這種情況下,如果因某些原因該網(wǎng)頁生成器類收到一個不正確的對象并調(diào)用它的"addHTML()"方法,那么你很容易理解將會發(fā)生的事情。在此,我重新修改了這里的沖突條件-通過使用一個不存在的(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();
 // 顯示網(wǎng)面
 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"操作符的威力所在。如果你想要看一下這個操作符是如何使用的,請繼續(xù)往下讀吧。

[1]?[2]?下一頁??



本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

function是什麼意思 function是什麼意思 Aug 04, 2023 am 10:33 AM

function是函數(shù)的意思,是一段具有特定功能的可重複使用的程式碼區(qū)塊,是程式的基本組成單元之一,可以接受輸入?yún)?shù),執(zhí)行特定的操作,並傳回結(jié)果,其目的是封裝一段可重複使用的程式碼,提高程式碼的可重複使用性和可維護性。

如何在PHP8中使用Attributes管理程式碼註解? 如何在PHP8中使用Attributes管理程式碼註解? Oct 18, 2023 am 09:48 AM

如何在PHP8中使用Attributes管理程式碼註解?隨著PHP8的發(fā)布,一個令人興奮的新功能引入了,那就是Attributes(特性)。 Attributes是一種程式碼註解的方式,使得我們可以以一種結(jié)構(gòu)化的方式為類別、方法和屬性添加元資料。在本文中,我們將探討如何在PHP8中使用Attributes管理程式碼註解,並提供一些具體的程式碼範例。一、什麼是Attrib

'enumerate()'函數(shù)在Python中的用途是什麼? 'enumerate()'函數(shù)在Python中的用途是什麼? Sep 01, 2023 am 11:29 AM

在本文中,我們將了解enumerate()函數(shù)以及Python中「enumerate()」函數(shù)的用途。什麼是enumerate()函數(shù)? Python的enumerate()函數(shù)接受資料集合作為參數(shù)並傳回一個枚舉物件。枚舉物件以鍵值對的形式傳回。 key是每個item對應的索引,value是items。語法enumerate(iterable,start)參數(shù)iterable-傳入的資料集合可以作為枚舉物件傳回,稱為iterablestart-顧名思義,枚舉物件的起始索引由start定義。如果我們忽

MySQL.proc表的作用與功能詳解 MySQL.proc表的作用與功能詳解 Mar 16, 2024 am 09:03 AM

MySQL.proc表的功能與功能詳解MySQL是一種流行的關(guān)係型資料庫管理系統(tǒng),開發(fā)者在使用MySQL時常常會涉及到預存程序(StoredProcedure)的建立與管理。而MySQL.proc表則是一個非常重要的系統(tǒng)表,它儲存了資料庫中所有的預存程序的相關(guān)信息,包括預存程序的名稱、定義、參數(shù)等。在本文中,我們將詳細解釋MySQL.proc表的作用與功能

聊聊Vue2為什麼能透過this存取各種選項中屬性 聊聊Vue2為什麼能透過this存取各種選項中屬性 Dec 08, 2022 pm 08:22 PM

這篇文章帶大家解讀vue原始碼,來介紹一下Vue2中為什麼可以使用 this 存取各種選項中的屬性,希望對大家有幫助!

PHP8中如何使用Attributes為類別添加自訂註解? PHP8中如何使用Attributes為類別添加自訂註解? Oct 18, 2023 am 10:16 AM

PHP8中如何使用Attributes為類別添加自訂註解?自訂註解是一種在類別或方法上添加元資料的方式,它可以幫助我們在運行時獲取和處理特定的類別或方法上的附加資訊。在PHP8中,引入了Attributes的概念,它使我們可以輕鬆地為類別添加自訂註解。本文將介紹如何在PHP8中使用Attributes來實作類別的自訂註解,並提供具體的程式碼範例。在PHP8中,自

PHP將 GD 映像輸出到瀏覽器或文件 PHP將 GD 映像輸出到瀏覽器或文件 Mar 21, 2024 am 10:41 AM

這篇文章將為大家詳細講解有關(guān)PHP將GD圖像輸出到瀏覽器或文件,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。 PHP將GD影像輸出到瀏覽器或檔案引言phpGD函式庫為處理影像提供了強大的功能,可讓您建立、編輯和輸出映像??梢詫⒂跋褫敵龅綖g覽器或文件,以進行顯示或進一步處理。輸出到瀏覽器要將映像輸出到瀏覽器,請使用下列步驟:建立映像資源:使用imagecreate()函數(shù)建立映像資源。載入圖片資料:使用imagepng()、imagejpeg()或imagegif()

如何在PHP中使用SOA函數(shù) 如何在PHP中使用SOA函數(shù) May 18, 2023 pm 01:10 PM

隨著網(wǎng)際網(wǎng)路的發(fā)展,SOA(服務導向的架構(gòu))成為了當今企業(yè)級系統(tǒng)中的重要的技術(shù)架構(gòu)。 SOA架構(gòu)中的服務可以重複使用、重組和擴展,同時也能夠簡化系統(tǒng)開發(fā)和維護的過程。 PHP作為一種被廣泛使用的Web程式語言,也提供了一些實作SOA的函數(shù)函式庫。接下來,我們將詳細介紹如何在PHP中使用SOA函數(shù)。一、SOA的基本概念SOA是分散式系統(tǒng)開發(fā)的思想與架構(gòu)

See all articles