【PHP】PHP魔方函数解释

这篇博客详细介绍了PHP中的魔术方法,包括__construct、__get、__set、__isset、__unset、__call、__clone、__toString、__sleep、__wakeup、__invoke、__callStatic、__set_state和__destruct。通过示例展示了这些方法在不同场景下的应用,如访问私有属性、处理未定义属性和方法、对象复制、序列化和反序列化等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PHP魔方函数,详细如下

 

<?php
class Test
{
	private $sex;
	//private $name;

	/**
	 * 构造函数
	 * */
	public function __construct()
	{
		echo 'Class construct >>> ' . '<br/>';
	}

	/**
	 * 外部调用私有变量时调用。
	 * 如果不设置此方法,会提示 Fatal error: Uncaught Error: Cannot access private property Test::$sex 
	 * */
	public function __get($keyName)
	{
		if($keyName == 'sex'){
			if($this->sex == '女'){
				echo 'I am a girl' . '<br/>';
			}else{
				echo 'I am a boy' . '<br/>';
			}
		}
		echo 'This get value is >>>' . $keyName. '<br/>';
	}

	/**
	 * 外部给未定义的属性赋值时调用。
	 * */
	public function __set($key, $value)
	{
		echo 'This set value >>> ' . $key . '=>' . $value . '<br/>';
	}

	/**
	 * 当在一个未定义的属性上调用isset()函数时调用此方法
	 * */
	public function __isset($key)
	{
		echo 'This isset value is >>>' . $key. '<br/>';
	}

	/**
	 * 当在一个未定义的属性上调用unset()函数时调用此方法
	 * */
	public function __unset($key)
	{
		echo 'This unset value is >>>' . $key. '<br/>';
	}

	/**
	 * 当调用一个没定义的函数时调用些方法
	 * */
	public function __call($fn, $arg)
	{
		echo 'Call undefined function >> ' . $fn. ' UUUU With argument >> '. json_encode($arg) .' <br/>';
	}

	/**
	 * 对象赋值是使用的引用赋值,如果想复制一个对象则需要使用clone方法,在调用此方法是对象会自动调用__clone魔术方法
	   如果在对象复制需要执行某些初始化操作,可以在__clone方法实现
	 * */
	public function __clone()
	{
		echo 'I am clone >>> <br/>';
	}

	/**
	 * 方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时
	   如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in
	   此方法必须返回一个字符串
	 * */
	public function __toString()
	{
		echo 'Print obj >> <br/>';
		return 'String>>> <br/>';
	}

	/**
	 * 当一个对象被串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接受参数. __sleep方法必须返回一个数组,包含需要串行化的属性. PHP会抛弃其它属性的值. 如果没有__sleep方法,PHP将保存所有属性.
	 * */
	public function __sleep()
	{
		echo 'Sleep, Call for serialize >>> <br/>';
		return ['sex'];
	}

	/**
	 * 同__sleep
	 * */
	public function __wakeup()
	{
		echo 'Wakeup, Call for unserialize >>> <br/>';
	}

	/**
	 * 当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用
	 * */
	public function __invoke($arg)
	{
		echo 'Invoke start>>> <br/>';
		var_dump($arg);
		echo 'Invoke end >>> <br/>';
	}

	/**
	 * 类似__call,处理静态方法调用
	 * */
	static public function __callStatic($fn, $arg)
	{
		echo 'Call undefined static function >> ' . $fn. ' With argument >> '. json_encode($arg) .' <br/>';
	}

	/**
	 * 当调用 var_export() 导出类时,此静态方法会被自动调用
	 * */
	static public function __set_state($arg)
	{
		echo '__set_state >>>'. json_encode($arg) .' <br/>';
	}

	/**
	 * @method 析构函数
	 * */
	public function __destruct()
	{
		echo 'Class destruct >>> ' . '<br/>';
	}
}


//for test
$Test = new Test();

//test __set
$Test->name = 'Linkunyuan';
$Test->age = 18;

//test __get
$Test->sex = '男';

//isset
isset($Test->test);

//unset
unset($Test->test);

//访问不存在的函数
$Test->test([1 => 'a']);

//克隆对象
$Test2 = clone $Test;

//打印对象
echo $Test;

//测试序列化
$a = ['a', 'b', 'c', 'd'];
$s = serialize($Test);
$s2 = unserialize($s);

echo $Test($a);

//测试调用不存在的静态方法
$Test::func($a);

//var_export($Test);

测试结果

Class construct >>>
This set value >>> name=>Linkunyuan
This set value >>> age=>18
This set value >>> sex=>男
This isset value is >>>test
This unset value is >>>test
Call undefined function >> test UUUU With argument >> [{"1":"a"}]
I am clone >>>
Print obj >>
String>>>
Sleep, Call for serialize >>>
Wakeup, Call for unserialize >>>
Invoke start>>>
array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } Invoke end >>>
Call undefined static function >> func With argument >> [["a","b","c","d"]]
Class destruct >>> 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值