/**
* 魔术方法
* __set//修改私有方法值得的时候使用
* __get//外部调用私有方法时使用
* __isset//检测私有方法是否存在
* __unset//删除私有属性时__unset进行回调
* __call//调用不存在的方法时触发
* __callStatic//调用不存在的静态方法时触发
* __invoke//当对象以函数的方式被调用时触发
* __toString//当你打印对象的时候,这个方法就会被自动调用
*/
//__set __get
class Test
{
private $abc = '';
private $cba = '';
public function __set($var, $val)//var为属性名,val为属性值
{
$this->$var = $val;
}
public function __get($var)//外部调用时触发,返回外部调用的私有属性和值
{
return $this->$var;
}
}
$test = new Test();
$test->cba = 'cba';//通过__set魔术方法设置的属性名和属性值就可以在外部修改对象里面的私有属性的值
var_dump($test->cba);//在外部输出类内部私有属性时,通过__get魔术方法进行私有属性值得返回
//__isset
class Demo
{
private $abc = 'abc';
public function __isset($var)
{
return isset($this->$var) ? true : false;//判断私有属性是否存在
}
}
$test = new Demo();
var_dump(isset($Demo->abc);//当isset函数不能访问私有属性$abc时,触发__isset函数判断$abc属性是否存在,并返回私有属性是否存在true或false
//__unset
class Test
{
private $abc = 'abc';
public function __unset($var)
{
echo "__unset" . $var;
unset($this->$var);
}
}
$test = new Test();
unset($test->abc);//删除私有方法abc属性
//__call
class Test
{
public function __call($func, $arguments);//$func调用的方法名,$arguments调用的方法值
echo $func;
print_r($arguments);
}
$test = new Test();
$test->go(1,'ok');//当调用了一个没有的方法,但是不希望程序报错,而是让他执行一个逻辑方法,输出我们想要的东西,这时我们用__coll这个魔术方法
//__callStatic
class Test
{
public static function __callStatic($method,$arg)//$method方法名,$arg方法值
{
echo $method;
print_r($arg);
}
}
Test::go(1,'ok');//当调用了一个没有的静态方法,但是不希望程序报错,而是让他执行一个逻辑方法,输出我们想要的东西,这时我们用__callStatic这个魔术方法
//__invoke
class Test
{
public function __invoke($arg)
{
var_dump($arg);
}
}
$test = new Test();
$test('go.....');//把对象当函数使用时,就会自动调用__invoke方法
//__toString
class Test
{
public function __toString($arg)
{
return 'hello.....';
}
}
$test = new Test();
echo $test;//当你打印对象的时候,__toString这个方法就会被自动调用