self 、static、parent、this、instanceof
1、self调用的静态方法或属性始终表示其在使用的时候的当前类(A)的方法或属性,可以替换为其类名,但是在类名很长或者有可能变化的情况下,使用self::的方式无疑是更好的选择。static调用的静态方法或属性会在继承中被其子类重写覆盖,应该替换为对应的子类名(B)。parent关键字用于调用父类的方法和属性。在静态方法中,可以调用父类的静态方法和属性;在非静态方法中,可以调用父类的方法和属性。关于PHP中的is_callable()函数,手册中是这样说的“检测参数是否为合法的可调用结构”,但是没有很好的演示代码,所以今天我在我的WEB开发笔记上发一下演示代码,希望能给大家对is_callable()的理解上有一些帮助。演示代码如下:<?phpclass 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_arraymixed 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 运算符是PHP5 引进的。在此之前用 is_a(),但是 is_a() 已经过时了,最好用 instanceof。1、用来确定一个变量是否属于某个类的实例;2、用来确定一个变量是否是继承自某一父类的子类的实例;3、用来确定一个变量是否是实现了某个接口的对象的实例。对于PHP面向对象, 类中的方法的参数可以是对象,在传对象的过程中任何类的对象都可以传进去,但是不同的对象传入到此方法后效果不同,比如此方法用一个对象可以调用这个对象 的方法,但是如果传入的对象没有此方法,那就会报错,因为根本就没有你调用的方法啊,所以传入的对象是要有判断的。曾经我们讲过一个解决方法,那就是把方法的参数类型确定,对象参数也要指定对象类型即可,但是今天讲的是instanceof运算符来保障代码正常运行, 用instanceof运算符可以在方法里面判断,性能更好,下面是一个运用instanceof运算符的例子和没用时的比较。没用instanceof运算符判断就会报错,示例代码如下:<?phpclass User{private $name="zhenlw";public functiongetName(){return "UserName is ".$this->name;}}class NormalUser extends User {private $age = 99;public function getAge(){return "age is ".$this->age;}}class UserAdmin{//操作.public static functiongetUserInfo(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运算符来进行判断,修改后的示例代码如下:<?phpclass User{private $name="zhenlw";public functiongetName(){return "UserName is ".$this->name;}}class NormalUser extends User {private $age = 99;public function getAge(){return "age is ".$this->age;}}class UserAdmin{//操作.public static functiongetUserInfo(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判断数据类型后就可以保证代码的健壮性,不论你传入的是哪个对象,都可以正确的对此对象进行处理。