php类与对象的魔术方法

1.__construct():构造函数,在实例化对象时被调用

2.__destruct():解析函数。(不常用)

3.__set():属性重载,在给不可访问属性赋值时,会被调用

4.__isset():属性重载,当对不可访问属性调用isset()时,会被调用,返回布尔值

5.__unset():属性重载,当对不可访问属性调用unset()时,会被调用

6.__clone():克隆

7.__toString():用于返回一个字符串。只有在直接使用于echo或print时才能生效

8.__autoload():自动加载类文件

9.__get():属性重载,在读取不可访问属性的值时,会被调用

10.__call():方法重载,在对象中调用一个不可访问方法时,__call会被调用

11.__autoload():没有引入文件时自动加载

12.__sleep():当对象串行化(serialize()串行化对象)那一瞬间会调用该方法。不能返回父类的私有成员名字。

13.__wakeup():在反序列化操作(unserialize()反序列化)那一瞬间会调用该方法。

注意:属性重载只能在对象中进行。在静态方法中,这些魔术方法不会被调用,所以这些方法不能被声明为static。

eg:

  

function __autoload($name){
include_once $name.".class.php";
}
$human = new Human();
echo $human->age."<br>";//18


class Student
{
public $name,$age;
function __construct($name,$age){
$this->name = $name;
$this->age = $age;
}
function __toString()
{
// TODO: Implement __toString() method.
return $this->name."今年".$this->age;
}
function __clone()
{
// TODO: Implement __clone() method.
}
//不存在函数时会调用该方法
function __call($name, $arguments)
{
// TODO: Implement __call() method.
echo $name."方法不存在"."<br>";
print_r($arguments);
echo "<br>";
}
function __isset($name)
{
// TODO: Implement __isset() method.
//echo "Is"."&nbsp".$name."&nbsp"."set?";
return isset($this->data[$name]);
}
//当对象被串行化那一瞬间
function __sleep()
{
// TODO: Implement __sleep() method.
echo "我要睡着了";
return array("name","age");
}
//当字符串反序列化变回对象那一瞬间调用
function __wakeup()
{
// TODO: Implement __wakeup() method.
echo "<br>";
echo "我要醒了";
}
}


$stu = new Student("张三",18);
echo $stu."<br>"; //张三今年18
$stu2 = clone $stu;
$stu2->name = "李四";
echo $stu2."<br>"; //李四今年18
$stu2->show("王五",18); //show方法不存在 Array ( [0] => 王五 [1] => 18 ) 
var_dump(isset($stu2->num)); //bool(false)
echo "<br>";
//串行化对象
$str = serialize($stu); //此时调用sleep函数,输出我要睡着了
echo "<br>";
echo $str; //O:7:"Student":2:{s:4:"name";s:6:"张三";s:3:"age";i:18;}
//反序列化字符串
$strToArr = unserialize($str); //此时调用wakeup函数,输出我要醒了
echo "<br>";
echo $strToArr; //张三今年18
posted @ 2017-03-28 15:53  VictoriaChen  阅读(1292)  评论(0编辑  收藏  举报