php裏的 instanceof 的用法詳解

instanceof
php5爲面向對象引入的php中惟一的類型運算符。

instanceof用來檢測一個給定的對象是否屬於(繼承於)某個類(class)、某個類的子類、某個接口(interface)。若是是則返回true。
 
看下面的一段代碼
<?php 
    class baseClass {} 
    class subClass extends baseClass{} 
     
    interface aInterface {} 
    class aClass implements aInterface {} 
     
    $a = new baseClass(); 
    var_dump( ($a instanceof baseClass));  //true
    $b = new subClass();
    var_dump( ($b instanceof baseClass));  //true
    $c = new aClass(); 
    var_dump( ($c instanceof aInterface)); //true
    ?>

 注:使用 instanceof 時 不能是類名對類名,而是實例化名對類名 php


對於PHP面向對象, 類中的方法的參數能夠是對象,在傳對象的過程當中任何類的對象均可以傳進去,可是不一樣的對象傳入到此方法後效果不一樣,好比此方法用一個對象能夠調用這個對象 的方法,可是若是傳入的對象沒有此方法,那就會報錯,由於根本就沒有你調用的方法啊,因此傳入的對象是要有判斷的。 性能


     曾經咱們講過一個解決方法,那就是把方法的參數類型肯定,對象參數也要指定對象類型便可,可是今天講的是instanceof運算符來保障代碼正常運行, 用instanceof運算符能夠在方法裏面判斷,性能更好,下面是一個運用instanceof運算符的例子和沒用時的比較。 this


沒用instanceof運算符判斷就會報錯,示例代碼以下: spa


 

<?php code

  class User{ orm

    private $name="zhenlw"; 對象

    public function getName(){ 繼承

      return "UserName is ".$this->name; 接口

    } get

  }

 class NormalUser extends User {

   private $age = 99;

   public function getAge(){

     return "age is ".$this->age;

   }

 }

 class UserAdmin{   //操做.

   public static function getUserInfo(User $user){

     echo $user->getAge();

   }

 }

 $User = new User();

 UserAdmin::getUserInfo($User);

?>

運行後報以下錯誤:


Fatal error: Call to undefined method User::getAge() in D:xampphtdocstest8test.php on line 20
 

 

由於你傳入的對象參數根本沒有getAge方法,若是是NormalUser的對象的話就能夠正常運行了,這個時候咱們運用instanceof運算符來進行判斷,修改後的示例代碼以下:


 

<?php

 class User{

   private $name="zhenlw";

   public function getName(){

     return "UserName is ".$this->name;

   }

 }

 class NormalUser extends User {

   private $age = 99;

   public function getAge(){

     return "age is ".$this->age;

   }

 }

 class UserAdmin{  //操做.

   public static function getUserInfo(User $user){

     if($user instanceof NormalUser){

       echo $user->getAge();

     } elseif($user instanceof User){

       echo $user->getName();

     }

   }

 }

 $User = new User(); // 這裏是User的對象.

 UserAdmin::getUserInfo($User);

 echo "<br>";

 $normaluser = new NormalUser(); // 這裏是NormalUser的對象.

 UserAdmin::getUserInfo($normaluser);

?>


運行結果:


UserName is zhenlw
age is 99
 

 

     看到運行結果就知道了吧,運用instanceof判斷數據類型後就能夠保證代碼的健壯性,不論你傳入的是哪一個對象,均可以正確的對此對象進行處理。

相關文章
相關標籤/搜索