php中的魔术函数使用

来源:互联网 发布:学电脑编程先学什么 编辑:程序博客网 时间:2024/05/21 00:53

1、__tostring()

当输出变量时,自动调用,需要一个return;

<?phpclass Person{    private $name = "";    function __construct($name = ""){                         $this->name = $name;    }    function __tostring(){//在类中定义一个__toString方法        return  "Hello,".$this->name."!<br/>";        }}$WBlog = new Person('WBlog');echo $WBlog;//直接输出对象引用则自动调用了对象中的__toString()方法?>

2、__call($funcname,$args)

当类调用一个不存在的函数时会自动调用,参数有两个$funcname为不存在的方法的函数名,$args为该函数的参数

<?phpclass Person{    private $name = "";    function __construct($name = ""){                         $this->name = $name;    }function __call($funcname,$args){echo "你所调用的函数:$funcname(参数:<br />";var_dump($args);echo ")不存在!";}}$WBlog = new Person('WBlog');$WBlog->funcA(1,2,3,4,5,6);?>
3、__clone()

当复制一个类时,复制出来的类会自动调用此方法,此方法相当于复制出来的类的构造函数__construct(),如果在__clone中使用$this来获取属性,$this指的时复制出来的类,而不是原本的类

<?phpclass Person{    private $name = "";    function __construct($name = ""){                         $this->name = $name;    }function __clone(){$this->name = "李四";//将name重新赋值为李四$this指的是复制出来的类$p1}function say(){echo "你好我是{$this->name}<br>";}}$WBlog = new Person('WBlog');$p1 = clone $WBlog;//复制出一个新的类,__clone自动调用了$WBlog->say();$p1->say();?>


4、__autoload($classname)

这个函数只能在类外使用,当我们在一个文件里面要使用到别的类的时候,这个类就会自动执行,这样可以减少代码量并且提高写代码的速度

test.php

<?phpfunction __autoload($classname){echo $classname;include($classname.'.php');}class Person{    private $name = "";    function __construct($name = ""){                         $this->name = $name;    }function __clone(){$this->name = "李四";//将name重新赋值为李四$this指的是复制出来的类$p1}function say(){echo "你好我是{$this->name}<br>";}}$one = new One();?>

One.php

<?phpclass One{function __construct(){echo "1111111111111111";}}?>


5、__sleep()与_weakup()

__sleep()是在一个对象串行化的时候调用的函数,这个函数可以使得串行化的时候可以部分串行化

__weakup()则是一个对象反串行化时调用的函数。

例如下面有一个例子。

Person类

<?phpclass Person{    public $name = "";public $age = "";public $word = "";    function __construct($name,$age,$word){                         $this->name = $name;$this->age = $age;$this->word = $word;    }function say(){echo "你好我是{$this->name}<br>我的年龄是{$this->age}<br>我的工作是{$this->word}";}}?>
write类//将person类串行化保存成一个文本

<?phpfunction __autoload($className){include $className.'.php';}$p = new Person("张三",10,"程序猿");$str = serialize($p);//将$p这个类串行化file_put_contents("db.txt",$str);?>

read类//把文本反串行化为一个类

<?phpfunction __autoload($className){include $className.'.php';}$str = file_get_contents("db.txt");//从文件中读取出串行化后的数据$p = unserialize($str);//将$p这个类反串行化$p->say();/*输出你好我是张三我的年龄是10我的工作是程序猿*/?>

如果我们想只保存姓名和年龄不想保存职业,那么我们可以使用__sleep()进行处理

增加__sleep后的Person类

<?phpclass Person{    public $name = "";public $age = "";public $word = "";    function __construct($name,$age,$word){                         $this->name = $name;$this->age = $age;$this->word = $word;    }function say(){echo "你好我是{$this->name}<br>我的年龄是{$this->age}<br>我的工作是{$this->word}";}function __sleep(){return array("name", "age");}}?>
最后read()只会输出

你好我是张三
我的年龄是10
我的工作是

如果我们想read输出的时候年龄增加一岁

<?phpclass Person{    public $name = "";public $age = "";public $word = "";    function __construct($name,$age,$word){                         $this->name = $name;$this->age = $age;$this->word = $word;    }function say(){echo "你好我是{$this->name}<br>我的年龄是{$this->age}<br>我的工作是{$this->word}";}function __sleep(){return array("name", "age");}function __wakeup(){$this->age += 1;}}?>
最后read输出的结果

你好我是张三
我的年龄是10
我的工作是

0 0
原创粉丝点击