在PHP5中,通过方法传递变量的类型有不确定性。于是我们很难判断,一些操作是否可以运行。
使用instanceof运算符,可以判断当前实例是否可以有这样的一个形态。当前实例使用 instanceof与当前类,父类(向上无限追溯),已经实现的接口比较时,返回真。
"instanceof"操作符的使用非常简单,它用两个参数来完成其功能。
第一个参数是你想要检查的对象,第二个参数是类名(事实上是一个接口名),用于确定是否这个对象是相应类的一个实例。它的基本语法如下:if (object instanceof class name){//继承关系
}
下面举几个例子:
一:Manual的例子是这样的
<?php
class test
{ var $var;
function disp()
{
echo "Inside the class";
}
}
$obj=new test;
var_dump($obj instanceof test); // Prints bool(true)
?>
二:下面举个更具体的例子:
<?
class User{
private $name;
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){
echo $_user->getAge();
}
}
$normalUser = new NormalUser();
UserAdmin::getUserInfo($normalUser);
?>
上面的程序运行结果是:
age is 99
然而,在User类中因为没有getAge()这个方法而被调用则会报错:
<?
class User{
private $name;
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){
echo $_user->getAge();
}
}
$User = new User(); // 这里new的是User.
UserAdmin::getUserInfo($User);
?>
上面程序运行结果:
Fatal error: Call to undefined method User::getAge() in E:\PHPProjects\NowaMagic\php\php_InstanceofOperator.php on line 99
所以,我们可以使用instatnceof运算符,在操作前先进行类型判断。以保障代码的安全性。
<?
class User{
private $name;
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();
}else{
echo "类型不对";
}
}
}
$User = new User(); // 这里new的是User.
UserAdmin::getUserInfo($User);
?>
程序运行结果:
类型不对.
二:下面贴出的是LZ项目代码的一部分(不解释O(∩_∩)O~)
/***
* Add item to the shopping cart
* If the position was previously added to the cart,
* then information about it is updated, and count increases by $quantity
* @param IECartPosition $position
* @param int count of elements positions
* @return bool
*/
public function put(IECartPosition $position, $quantity = 1) {
$key = $position->getId();
if ($this->itemAt($key) instanceof IECartPosition) {
$position = $this->itemAt($key);
$oldQuantity = $position->getQuantity();
$quantity += $oldQuantity;
}
if($this->update($position, $quantity))
return true;
}