PHP 魔术方法和触发场景:
__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;//获取克隆对象属性,发现改变
?>
```
综上,克隆后的对象属性的改变不影响原对象
克隆的过程中,可以自己设置自己的值,没必要完全克隆(根据实际情况)
PHP设计模式:
工厂模式
单例模式
注册数模式
适配器模式
观察者模式
策略模式
网友评论