外部想要对私有属性进行读取和修改。
<?php class Test { private $abc = ''; public function setAbc($val) //修改 { $this->abc = $val; } public function getAbc() //读取 { return $this->abc; } } $test = new Test(); $test = setAbc('hahaha'); //hahaha赋给参数$val var_dump($test->getAbc()); //打印出:string(6)"hahaha"
若有多个私有属性要被外部访问,上述就不行了,所以有了两个魔术方法:__set 和 __get 。如:
<?php class Test { private $abc = ''; private $cba = ''; public function __set($var,$val) //修改。 __set(属性名,属性值) { $this->$var = $val; } public function __get($var) //读取。 __get(属性名) { return $this->$var; } } $test = new Test(); $test->abc = 'hahaha'; //当给私有属性赋值时,会默认自动地调用__set方法,如果类里没有__set方法,就会报错 var_dump($test->abc); //打印出:string(6)"hahaha"
魔术方法 __isset 用于检测私有属性是否存在。
<?php class Test { private $abc = 'abc'; public function __isset($var) { return isset($this->$var)?true:false; } } $test = new Test(); var_dump(isset($test->abc)); //打印出:bool(true)
魔术方法__unset 删除
<?php class Test { private $abc = 'aaa'; public function __unset($var) { unset($this->$var); } } $test = new Test(); unset($test->abc);
为避免要调用的方法不存在,用魔术方法 __call 当被调用的方法不存在时,__call 会自动被调用。如:
<?php class Test { public function __call($func,$arguments) //__call(方法名,参数) { echo($func . "<br/>"); print_r($arguments); } } $test = new Test(); $test->go(1,'ok'); //结果为:go // Array( [0] =>1 [1] => ok )
当静态方法不存在时,魔术方法__callStatic 会被自动调用。如:
<?php class Test { public static function __callStatic($method,$arg) //要加static关键字 __callStatic(方法名,参数) { echo($method . "<br/>"); print_r($arg); } } Test::go(1,'ok'); //结果为:go // Array( [0] =>1 [1] => ok )
当对象以函数的方式被调用时,魔术方法__invoke会自动被调用。
<?php class Test { public function __invoke($arg) { var_dump($arg); } } $test = new Test(); $test('go....'); //这就是对象以函数的方式被调用 结果为:string(6)"go...."
当对象被打印时,魔术方法__toString() 会自动被调用。
<?php class Test { public function __toString() { return "hello....."; } } $test = new Test(); echo($test); //结果为:hello......
__toString() 当类的实例被直接打印的时候,会调用这个方法执行操作
__invoke() 将类的实例直接当函数来使用,会自动调用这个方法来执行操作
__callStatic() : 静态方法不存在的时候,自动调用它来执行操作,避免报错
__call() : 方法不存在的时候,自动调用它来执行某些操作,避免直接报错
__unset()
__isset()
魔术方法
__set __get
在对象中调用一个不可访问方法时,__call() 会被调用。
为了防止调用的类的方法不存在时发生错误,可以使用__call方法来避免。当调用的类的方法不存在时会自动调用__call方法
在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
__toString() 方法用于一个类被当成字符串时应怎样回应
吧对象当做字符串的时候调用魔术方法__toString
把类当做方法的时候调用魔术方法__invoke
静态魔术方法__callStatic
当调用方法不存在的时候访问魔术方法__call
当unset的属性不存在的时候,可以设置访问魔术方法__unset
通过魔术方法__set和__get自动给类的私有属性赋值
当把对象当做函数去调用的时候 会自动调用 __invoke()
class Test{
public function __invoke ($arg){ var_dump($arg); }
}
$tett=new Test();
$test('go...');
当给一个私有属性赋值时 就会自动调用 __set(属性名,属性值)
__isset(属性名)检测私有属性是否存在
__unset 用户在删除私有属性时 __unset方法会进行一个回调
为了避免当调用的方法不存在时产生的错误 使用__call(方法名,方法的参数)
为了避免当调用的静态方法不存在时产生的错误 使用__callStatic(方法名,方法的参数 如果参数为多个 则为索引数组格式)此魔术方法也是静态的 public static function __call Static($method,$arg)
魔术方法:
__set 有两个参数 __set(属性名,属性值) 修改私有属性
__get 有一个参数 __get(属性名) 查看私有属性
__isset 有一个参数 __isset(判断的属性名) 用于检测私有属性是否存在
__unset 有一个参数 __isset(删除的属性名) 用于删除私有属性
__call 有两个参数 __call(函数名,函数值) 如果class内没有这个函数,则执行这个[不会因为没有函数方法报错]
__callStatic 有两个参数 __call(函数名,函数值) 【静态static】如果class内没有这个函数,则执行这个[不会因为没有函数方法报错]
__invoke 当类被当作函数使用 就会自动调用这个魔术方法
__toStrgin 如果打印对象变量方法的话,会自动调用 当作字符串输出