php魔术方法-----__tostring(),__invoke,__call(),__callStatic ...
###__tostring(),__invoke()
- __tostring()方法是在对象当作字符串输出时被自动调用 - __invoke()方法是在对象当作方法时被自动调用
<?php
class Tomato {
public function __tostring(){
return "string";
}
public function __invoke(){
echo "invoke";
}
}
$tomato = new Tomato();
echo $tomato; //对象当作字符串输出
$tomato(); //对象当作方法
__call(),__callStatic()
- __call()实现对方法的重载 - __callStatic()实现对静态方法的重载 - implode()等价于spilt()方法
<?php
class Tomato {
public function __call($name, $arguments){
echo '$name:'.$name.'$arguments:'.implode(", ", $arguments);
}
public static function __callStatic($name, $arguments){
echo '$name:'.$name.'$arguments:'.implode(", ", $arguments);
}
}
$tomato->runSet("Allo", "Bllo"); //类内部没有该方法,是通过__call()重载实现的
Tomato::deRunSet("Cllo", "Dllo"); //类内部没有该静态方法,是通过__callStatic()重载实现的
?>
__get(),__set()__isset(),__unset(),__empty()
- 获取对象属性时__get()被自动调用,一般用于获取私有属性 - 设置对象属性时__set()被自动调用 - isset判断是否存在该属性,empty相反 - 释放变量时__unset(),被自动调用
<?php
class Tomato {
private $name = "火星情报局";
public function __get($name){ //参数为属性名
if(isset($name)){ //isset判断是否存在该属性,与empty相反
echo "存在";
echo $this->name;
}else{
return null;
}
}
public function __set($name, $value){ //参数为 属性名、属性值
echo $this->$name = $value; //设置属性
}
public function __unset($name){ //释放属性变量时,被自动调用
echo "null";
}
}
$tomato->name; //获取元素属性
$tomato->name = "提莫队长"; //设置元素属性
unset($tomato->name); //释放变量
?>
__clone()
- __clone(),在对象被克隆时调用 - 克隆后的对象具有与原对象相同的所有属性、方法 - 克隆后的对象属性的改变不影响原对象,即互不影响 - __clone()方法内部可以设置哪些属性不必克隆,用自己设置即可
<?php
class Tomato {
private $name = "火星情报局";
private $title = "沈梦晨";
private $data = "2016";
public function __clone(){
echo $this->name = "老坛酸菜"; //该属性不必克隆,用自己设置的
}
}
$tomato2 = clone $tomato; //克隆对象
$tomato2->data="2017"; //通过克隆对象该变属性
$tomato->name; //获取原对象属性
$tomato->title; //原对象属性
$tomato->data; //获取原对象属性,发现没有改变
$tomato2->name; //获取现对象属性
$tomato2->title; //克隆对象属性,与原对象不一样
$tomato2->data; //获取克隆对象属性,发现改变
?>
- 综上,克隆后的对象属性的改变不影响原对象
- 克隆的过程中,可以自己设置自己的值,没必要完全克隆(根据实际情况)