self 、static、parent、this、instanceof

2025-11-29 08:25:49

1、self调用的静态方法或属性始终表示其在使用的时候的当前类(A)的方法或属性,可以替换为其类名,但是在类名很长或者有可能变化的情况下,使用self::的方式无疑是更好的选择。 static调用的静态方法或属性会在继承中被其子类重写覆盖,应该替换为对应的子类名(B)。

parent关键字用于调用父类的方法和属性。在静态方法中,可以调用父类的静态方法和属性;在非静态方法中,可以调用父类的方法和属性。

关于PHP中的is_callable()函数,手册中是这样说的“检测参数是否为合法的可调用结构”,但是没有很好的演示代码,所以今天我在我的WEB开发笔记上发一下演示代码,希望能给大家对is_callable()的理解上有一些帮助。演示代码如下:

<?php

class test{

  public static function a(){

       return 'a';

   }

}

class abc {

   public function a($obj,$funcName){

        if(!is_callable(array($obj,$funcName))){//此处array($object,$funcname)的用法,相当于$object::$funcname调用$object的$funcname方法

              echo 'Error';

         }else{

               echo 'ok';

         }

   }

}

$abc = new abc();

$abc->a('test','aa');//test类下没有aa方法,会输出error;

$abc->a('test','a');//test类下有a方法,会输出ok

?>

2、常用的两个回调函数的学习call_user_func和call_user_func_array    mixed call_user_func ( callback function [, mixed parameter [, mixed ...]] ):利用第一个参数回调用户的函数例子:function barber($type){   echo "You wanted a $type haircut, no problem";}call_user_func('barber', "mushroom");call_user_func('barber', "shave");

类的方法也可以通过传递参数"array(类名,方法名)"的方式静态调用.

function increment(&$var){   $var++;}$a = 0;call_user_func('increment', $a);echo $a; // 0call_user_func_array('increment', array(&$a)); // You can use this insteadecho $a; // 1//这个例子能说明什么问题??我只看到call_user_func_array也不是以引用的方式传递的。//并且,如果类似的把call_user_func_array('increment', array(&$a));的第二个参数//换成:array($a)的话,$a也是不改变的。同理,如果把 call_user_func('increment', $a);//的第二个参数换成&$a的话,$a的值也是会+1的。

mixed call_user_func_array ( callback function, array param_arr ):调用一个用户定义的函数,参数以('函数名','函数参数数组')的方式定义。  

3、instanceof

instanceof用来检测一个给定的对象是否属于(继承于)某个类(class)、某个类的子类、某个接口(interface)。如果是则返回true。

instanceof 运算符是 PHP 5 引进的。在此之前用 is_a(),但是 is_a() 已经过时了,最好用 instanceof。

1、用来确定一个变量是否属于某个类的实例;

2、用来确定一个变量是否是继承自某一父类的子类的实例;

3、用来确定一个变量是否是实现了某个接口的对象的实例。

对于PHP面向对象, 类中的方法的参数可以是对象,在传对象的过程中任何类的对象都可以传进去,但是不同的对象传入到此方法后效果不同,比如此方法用一个对象可以调用这个对象 的方法,但是如果传入的对象没有此方法,那就会报错,因为根本就没有你调用的方法啊,所以传入的对象是要有判断的。

     曾经我们讲过一个解决方法,那就是把方法的参数类型确定,对象参数也要指定对象类型即可,但是今天讲的是instanceof运算符来保障代码正常运行, 用instanceof运算符可以在方法里面判断,性能更好,下面是一个运用instanceof运算符的例子和没用时的比较。

没用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){

     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 zhenlwage is 99 

     看到运行结果就知道了吧,运用instanceof判断数据类型后就可以保证代码的健壮性,不论你传入的是哪个对象,都可以正确的对此对象进行处理。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢