很多公司在招聘PHPers应届毕业生时,通常会考查一些PHP基础的知识。博主曾在几份笔试题中做到与PHP魔术方法相关的考题。今天就写个帖子,供PHPers菜鸟们参考讨论。
PHP的魔术方法主要有:__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、__wakeup()、__tostring()、__invoke()、__set_state()、__clone()。需要注意,每个方法名前的“__”是两条英文状态下的下划线,依次讲一下这些方法的使用。
1.__construct()、__destruct():这两个是最常见的魔术方法,在《 PHP基础学习注意点(一) 》一文中对这两个方法已经有所介绍,需要补充的是,子类在默认的状况下是不会调用从父类继承的构造函数的,需要用parent::__construct()显式地调用。
2.__call(string $name , array $ arguments ):该方法的返回值可以为任意类型,$name参数是要调用的方法名称,且区分大小写,$arguments参数是一个数组,包含着要传递给方法的参数。当调用一个不可访问方法(如未定义或不可见)时,该方法会自动被调用,实例代码如下:
class MethodTest { public function __call($name, $arguments) { // 注意: $name 的值区分大小写 echo $arguments[0] .",you are calling object method '$name' ". $arguments[1]."\n"; } } $obj = new MethodTest; $obj->runTest(‘Haha’,'in object context');//自动调用__call()方法,输出结果
分析:在上述代码中,类中并没有定义runTest()方法,但是由于定义了__call()魔术方法,此时方法名runTest会自动传给 形参 $name,而runTest()的实参将以数组的形式自动传给形参$arguments。
3.__callStatic(string $name , array $arguments):__callStatic()魔术方法的使用与__call()相似,唯一需要主要的是此方法只在PHP 5.3.0以后的版本支持启用,当调用未定义的 静态方法 时,此魔术方法会被自动调用。模式如下:
class MethodTest { public static function __callStatic($name, $arguments) { // 注意: $name 的值区分大小写 echo $arguments[0] .",you are calling object method '$name' ". $arguments[1]."\n"; } } MethodTest::runTest(‘Haha’,'in static context');//自动调用__callStatic()方法,输出结果
关于如何调用一个静态方法,亦可以参考《 PHP基础学习注意点(一) 》一文。
4.__get()、__set():这通常是成对出现的魔术方法,在给未定义的变量赋值时,__set()会自动被调用,读取未定义的变量时,__get()会自动被调用。模拟使用该魔术方法的实例如下:
重载 的数据保存在这个数组中
private $data = array();
public function __set($name,$value){
echo "Setting '$value' to '$name' \n";
$this->data[$name] = $value;
}
public function __get($name){
echo "Getting value from method of set:$name=".$this->data[$name]."\n";
return $this->data[$name];
}
}
$obj = new PropertyTest();
$obj->a = 1;
echo $obj->a;
?>
分析:注意到成员属性a并没有在类中定义,执行$obj->a=1语句时,此时会自动调用__set($name,$value)方法,并且a将传递给形参$name,1将传递给形参$value;当执行echo
$obj->a时,程序会自动调用__get($name)方法,需要注意的是,此时__get()的参数并不要求与__set()的第一个参数相同。
5.__clone():这个魔术方法非常好理解,当对象被克隆的时候,即自动调用该方法。演示实例如下:
class MyCloneable { public function __clone() { echo "当前对象被克隆了哦"; } } $obj = new MyCloneable(); $obj1 = clone $obj; //克隆刚才创建的对象$obj
分析:当执行$obj1 = clone $obj;语句时,自动调用__clone()方法,输出结果:当前对象被克隆了哦
后续阅读《面试集锦:盘点PHP魔术方法的使用(二)》
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~