php中的魔术函数使用

1、__tostring()

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

<?php
class 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为该函数的参数

<?php
class 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指的时复制出来的类,而不是原本的类

<?php
class 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

<?php
function __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

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


5、__sleep()与_weakup()

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

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

例如下面有一个例子。

Person类

<?php
class 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类串行化保存成一个文本

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

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

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

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

增加__sleep后的Person类

<?php
class 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输出的时候年龄增加一岁

<?php
class 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值