腾讯php程序员面试题-15个魔术方法的总结

发布时间:2020-09-17编辑:脚本学堂
本文介绍下,据说是腾讯的php程序员面试题,包括15个魔术方法的总结,有需要的朋友,建议参考下,确实很有价值。
8.__isset() 当对一个未声明或者访问级别受限的成员属性调用isset函数时调用此函数,共用户做一些操作

9.__unset() 当对一个未声明或者访问级别受限的成员属性调用unset函数时调用此函数,共用户做一些操作

10.__toString()函数 该函数在将对象引用作为字符串操作时自动调用,返回一个字符串

 

复制代码 代码示例:

<?php

//初始化一个类

class Phone{

//类的成员属性

private $brand;

private $model;

private $price;

//构造函数

function __construct($pbrand,$pmodel,$pprice){

$this->brand=$pbrand;

$this->model=$pmodel;

$this->price=$pprice;

//魔术方法__toString()

function __toString(){

return "{$this->brand} {$this->model} {$this->price}";//可以自定义操作但必须要返回一个字符串结果

}

}// the end of class

//实例化一个对象

$p=new Phone('Google','Nexus One',4200);

//如果没有在类中使用__toString函数则报错Catchable fatal error: Object of class Phone could not be converted to string

//如果在类中使用了__toString函数,则把对象当字符串输出时,执行__toString函数操作

echo $p;

?>

11.__sleep()函数 该函数是在序列化时自动调用的,序列化这里可以理解成将信息写如文件中更长久保存

 

复制代码 代码示例:

<?php

//初始化一个类

class User{

//类的成员属性

private $name;

private $age;

private $sex;

//构造函数

function __construct($pname,$page,$psex){

$this->name=$pname;

$this->age=$page;

$this->sex=$psex;

}

//设置魔术方法__sleep()

/*

功能:返回一个数组,选择是全部序列化还是部分成员属性序列化,如果没有该函数就表示全部序列化

在序列化的时候自动调用这个方法

*/

function __sleep(){

return array('name'); //返回一个只序列化name属性的数组

}

}//the end of the class

$u=new User('Androidyue',22,'Man');//实例化一个对象

file_put_contents('notepad1.txt',serialize($u));//序列化$u对象并且将信息存放在notepad1.txt文件中

                                                                                                                          

?>

12.__wakeup()函数 该魔术方法在反序列化的时候自动调用,为反序列化生成的对象做一些初始化操作

 

复制代码 代码示例:

<?php

//初始化一个类

class User{

//类的成员属性

private $name;

private $age;

private $sex;

//构造函数

function __construct($pname,$page,$psex){

$this->name=$pname;

$this->age=$page;

$this->sex=$psex;

}

//设置魔术方法__sleep()

/*

功能:返回一个数组,选择是全部序列化还是部分成员属性序列化,如果没有该函数就表示全部序列化

在序列化的时候自动调用这个方法

*/

function __sleep(){

return array('name'); //返回一个只序列化name属性的数组

}

function __wakeup(){

$this->name='Yue'; 

//$this->age=23;

}

}//the end of the class

$u=new User('Androidyue',22,'Man');//实例化一个对象

//file_put_contents('notepad1.txt',serialize($u));//序列化$u对象并且将信息存放在notepad1.txt文件中

//获取序列化的文件信息

$str=file_get_contents('notepad1.txt');

//对文件进行反序列化

$uu=unserialize($str);

//输出对象的信息

var_dump($uu);//结果:object(User)#2 (3) { ["name:private"]=> string(3) "Yue" ["age:private"]=> NULL ["sex:private"]=> NULL }

?>

13.当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。本方法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。

 

复制代码 代码示例:

<?php

class Author{

   public $name;

   public $works;

  public static function __set_state($arr){

    $a=new Author();

    $a->name=$arr['name'];

    $a->works=$arr['works'];

      return $a ;

   }

}

$a = new Author();

//对成员属性赋值,当然通常我们不建议这样赋值(即将成员属性设置成public直接赋值)

$a->name='Androidyue';

$a->works='PHP codes';

//执行一个语句

eval('$b = ' . var_export($a, true) . ';');//这样是$b 为对象类型

//$b=var_export($a,true);//这样会是$b 为字符串

var_dump($b);

?>

14.__invoke

当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。

PHP5.3.0以上版本有效,我的php版本为5.2.12,暂不支持,因此无法演示。

15.__callStatic

它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,

PHP5.3.0以上版本有效  我的php版本为5.2.12,暂不支持,因此无法演示。

PHP 确实加强了对 __callStatic() 方法的定义;所作用的函数必须是公共的,并且必须被声明为静态的。同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。