您的位置:首页 > 编程语言 > PHP开发

关于php中的一些常见的魔术方法

2016-12-07 21:35 441 查看

在接触到php中的面向对象的部分的时候,接触了一大堆的魔术方法,接下来我们对其一一介绍他们的使用场景,使用方法,参数和返回值。

 首先介绍__construct与__destruct:
class Test{
public $name='xiaoMing';
protected $age = 18;
private $money = 300;
public function __construct(){
echo '对象已经创建<br />';
}
public function __destruct(){
echo '对象已经销毁<br />';
}
}
$test = new Test();




这两个魔术方法是在类创建和类销毁的时候自动调用的,说白了就是类的构造方法与析构方法,__construct就是构造方法,所以参数可有可无,如果你想下对象构建的时候对对象初始化,可以写在__construct的参数中,在方法体内给对象赋值。因为方法的性质,这两个方法都不需要返回值。

接着我们看看__toString与__debugInfo:
class Test{
public $name='xiaoMing';
protected $age = 18;
private $money = 300;
public function __toString(){
return '我是一个对象!'.'<br />';
}
public function __debugInfo(){
return ['name'=>$this->name];
}
}
$test = new Test();
echo $test;
var_dump($test);




顾名思义__toString是在对象被当成字符串处理时会调用,比如对象被直接echo的时候。因为是转换成字符串的操作,因此__toString需要返回一个字符串。__debugInfo会在对象被var_dump时被调用。返回值是一个数组,var_dump展示的就是这个数组

__invoke这是一个很无聊的函数,当对象被当成函数使用的时候会被触发,比如:
class B{
public function	__invoke($args,$d){
var_dump( $args);
var_dump($d);
}
}

$b = new  B();
$b('123','sdfds');




值得注意的是函数的参数要与调用的时候个数一致,返回值就是调用对象的返回值。

__clone,是由对象被克隆的时候由新对象调用。唯二值得注意的是是新的对象调用和对象被克隆的时候,要经过clone函数
__sleep与__wakeup是一对相反的函数,前者是对象被序列化的时候调用,后者是字符串被反序列话成对象的事后调用:
class Person{
public $name;
public $age;

//构造方法
public function __construct($name,$age){
$this->name = $name;
$this->age = $age;
echo '此处构造了一个新的对象<br />';
}
//析构方法
public function __destruct(){
echo '对象已经销毁<br />';
}
//对象被转换成字符转是执行的方法
public function __toString(){
return '我是一个对象!<br />';
}
//对象被序列换是执行的方法
public function __sleep(){
return ['name'];
}
//对象被反序列化时调用的方法
public function __wakeup(){
//此处可以对对象的属性进行一些修改,无需返回值
}
//对象被var_dump()是调用的方法
public function __debuginfo(){
return [
'name'=>$this->name,
//'age'=>$this->age,
];
}
public function __clone(){
echo '克隆开始了<br />';
}
//当对象被当做函数来调用的时候
public function __invoke(){
//参数和返回值根据自己的需要自定义即可
echo '是不是就乱用!<br />';
}
}

$xiaoMing = new Person('xiaoming',20);//创建对象
echo $xiaoMing;//对象被当做字符串处理
var_dump($xiaoMing);//触发__debugInfo
$xiaoli = unserialize(serialize($xiaoMing));//序列化与反序列化
$xiao = clone $xiaoMing;//克隆




当然魔术方法还有很多,这里只介绍了一部分。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: