很多公司在招聘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()显式地调用。

如何写发贴php面试集锦清点PHP魔术办法的应用一 GraphQL

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()会自动被调用。
仿照利用该魔术方法的实例如下:

<?phpclass PropertyTest {//被重载的数据保存在这个数组中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魔术方法的利用(二)》