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 >>>