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

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

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

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

對象

一、簡介

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

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

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

  本文將通過一些面向對象的示例來幫助你理解如何在PHP 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類在生成一個網面中特定的元素時是非常有用的,但是我有意地把每一個類的代碼寫成這樣,這樣它們就不能夠驗證輸入?yún)?shù)的有效性。你可能已經想到,輸入?yún)?shù)將直接被傳遞到類構造器中并且作為屬性賦值。問題出現(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-
 ?。総itle.'</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();
 //顯示網面
 echo $pageGen->fetchHTML();
}
catch(Exception $e){
 echo $e->getMessage();
 exit();
}
  在運行上面的PHP代碼后,你所得到的結果是一個簡單的網頁-它包含一些前面創(chuàng)建的(X)HTML對象。這種情況下,如果因某些原因該網頁生成器類收到一個不正確的對象并調用它的"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();
 // 顯示網面
 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]?下一頁??



本站聲明
本文內容由網友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅動的應用程序,用于創(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

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

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
function是什么意思 function是什么意思 Aug 04, 2023 am 10:33 AM

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

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

如何在PHP8中使用Attributes管理代碼注解?隨著PHP8的發(fā)布,一個令人興奮的新功能引入了,那就是Attributes(特性)。Attributes是一種代碼注解的方式,使得我們可以以一種結構化的方式為類、方法和屬性添加元數(shù)據(jù)。在本文中,我們將探討如何在PHP8中使用Attributes管理代碼注解,并提供一些具體的代碼示例。一、什么是Attrib

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

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

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

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

聊聊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為類添加自定義注解?自定義注解是一種在類或方法上添加元數(shù)據(jù)的方式,它可以幫助我們在運行時獲取和處理特定的類或方法上的附加信息。在PHP8中,引入了Attributes的概念,它使我們可以輕松地為類添加自定義注解。本文將介紹如何在PHP8中使用Attributes來實現(xiàn)類的自定義注解,并提供具體的代碼示例。在PHP8中,自

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

這篇文章將為大家詳細講解有關PHP將GD圖像輸出到瀏覽器或文件,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。PHP將GD圖像輸出到瀏覽器或文件引言phpGD庫為處理圖像提供了強大的功能,允許您創(chuàng)建、編輯和輸出圖像??梢詫D像輸出到瀏覽器或文件,以進行顯示或進一步處理。輸出到瀏覽器要將圖像輸出到瀏覽器,請使用以下步驟:創(chuàng)建圖像資源:使用imagecreate()函數(shù)創(chuàng)建圖像資源。加載圖像數(shù)據(jù):使用imagepng()、imagejpeg()或imagegif()

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

隨著互聯(lián)網的發(fā)展,SOA(面向服務的架構)已經成為了當今企業(yè)級系統(tǒng)中的一種重要的技術架構。SOA架構中的服務可以被重復使用、重組和擴展,同時還能夠簡化系統(tǒng)開發(fā)和維護的過程。PHP作為一種被廣泛使用的Web編程語言,也提供了一些用于實現(xiàn)SOA的函數(shù)庫。接下來,我們將詳細介紹如何在PHP中使用SOA函數(shù)。一、SOA的基本概念SOA是一種分布式系統(tǒng)開發(fā)的思想和架構

See all articles