魔术方法是PHP面向对象中特有的特性。它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,利用魔术方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法)。魔术方法很多还是成对出现的,以下列出目前PHP中所有的魔术方法。
1. __get()
在 php 面向对象编程中,类的成员属性被设定为 private 后,如果我们试图在外面调用它则会出现“不能访问某个私有属性”的错误。那么为了解决这个问题,我们可以使用魔术方法 __get()。
魔术方法__get()的作用:在程序运行过程中,通过它可以在对象的外部获取私有成员属性的值。
<?php
class Person{
/*封装私有成员属性*/
private $name='张三';private $sex='男';private $age=12;
/*__get()方法用来获取私有属性*/
function __get($property_name){
echo '在直接获取私有成员属性得时候,自动调用了这个__get()方法<br/>';
if(isset($this->$property_name))
{
return ($this->$property_name);
}else{
return NULL;
}
}
}
$p1=new Person();
/*直接获取私有属性得值,会自动调用__get()的方法,返回成员属性的值*/
echo '姓名:'.$p1->name.'<br/>';
echo '性别:'.$p1->sex.'<br/>';
echo '年龄:'.$p1->age.'<br/>';
2. __set()
__set( $property, $value )` 方法用来设置私有属性, 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。
<?php
//属性重载
class Person{
//魔术方法__set
//两个参数:属性名,属性值
public function __set($name,$value){
//增加一个允许列表,也就是说,只能在这些属性值里面,规定了属性值的范围
$allow = array('name','age','tail');
//判断用户的操作是否合法
if(in_array($name,$allow)){
//增加属性
$this->$name = $value;
}
}
}
//实例化
$person = new Person();
var_dump($person);
//给对象增加属性
$person->name = '爷爷';
$person->age = 80;
//增加一个不允许的属性
$person->drag = '大麻';
var_dump($person);
3.__isset()
判断一个属性是否被设置。
在对象外部使用isset()方法有两种情况:
如果参数是公有属性,那么可以利用isset()方法判断属性是否被设置;
如果参数是私有属性,isset()方法将无法使用。
那么,是否有办法判断私有属性被设置呢?当然,只需要在类里定义__isset()方法,就可以在对象外部利用isset()方法判断某个私有属性是否被设置了。
当然还有以下方法我就不举例了,以上是常用的
4.__unset()
5.__call()
6.__autoload()
7.__construct()
8.__destruct()
9.__clone()
10.__toString()
11.__sleep()
12.__wakeup()