常见魔术方法
参考: PHP常用的魔术方法及规则
1.__construct 具有构造函数的类会在每次创建新对象时先调用此方法;初始化工作执行。
3.__call() 在对象中调用一个不可访问方法时,__call() 会被调用。
4.__callStatic() 在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。
5.__set() 在给不可访问的属性赋值时调用
6.__get() 读取不可访问的属性值是自动调用
7.__isset() 当对不可访问的私有属性使用isset或empty时自动调用
8.__unset() 当对不可访问的私有属性使用unset时;自动调用
9.__toString()当一个类的实例对象;被当成一个字符串输出时调用
实例:(我直接用laravel的Controller来做实验了,实例里的dump() 是laravel 的断点函数)
1.父类:
class ParentController
{
private $name = 'xiaochi';
public function __construct($data = [])
{
dump('调用父类 __construct 构造函数');
}
private function syfun()
{
dump('这是私有方法');
}
private static function syfunStatic()
{
dump('这是静态私有方法');
}
//访问私有方法
public function __call($method, $arg_array)
{
dump("访问私有方法:".$method." ,自动调用了父类__call方法");
return $this->$method();
}
//访问静态私有方法
public static function __callStatic($method, $arg_array)
{
dump("访问静态私有方法:".$method." ,自动调用了父类__callStatic方法");
return self::$method();
}
//获取私有属性
public function __get($attribute){
dump("访问私有属性:".$attribute.",自动调用了父类__get()方法");
if(isset($this->$attribute)){
return $this->$attribute;
} else{
dump($attribute);
return $attribute;
}
}
//设置私有属性
public function __set($attribute,$val){
dump("赋值私有属性:".$attribute." 值:" .$val." ,自动调用了父类__set()方法为私有属性赋值");
$this->$attribute = $val;
}
// 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
public function __isset($attribute)
{
dump("是否定义 ".$attribute." 值?\n");
}
// 当对不可访问属性调用 unset()会被调用
public function __unset($attribute)
{
dump("销毁私有变量 ".$attribute." 时调动");
}
// 当类 被当成字符串时 会被调用
public function __toString() {
return __CLASS__.'类 被当做字符串调用';
}
}
子类:
class TestController extends ParentController
{
public function __construct($data = [])
{
//子类的构造方法中不会自动的调用父类的构造方法
parent::__construct(); //执行父类的构造函数
dump('调用子类 __construct 构造函数');
}
private $name2 = 'cyk';
public function magicFun()
{
echo $this->name; //获取父类private私有属性值自动调用父类__get()方法
$this->name = $this->name2; ///设置父类private私有属性值自动调用父类__get()方法
echo $this->name;
$this->syfun();
ParentController::syfunStatic();
dump(isset($this->name));
dump(empty($this->name));
unset($this->name);
echo (new ParentController());
}
}
以下是执行结果: