<?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判斷數據類型後就能夠保證代碼的健壯性,不論你傳入的是哪一個對象,均可以正確的對此對象進行處理。