注:博客参考https://www.cnblogs.com/TigerYangWTH/p/5907191.html, 本博客纯属个人观点,有错误欢迎纠正
首先我谈一下魔术方法,魔术方法就是一些用于特定功能、php自带的方法,在某些条件满足的情况下魔术方法就会被调用以处理问题。
于是谈魔术方法就离不开两个方面:
- 触发时机
- 功能
__call与__callStatic魔术方法
__call:
- 触发时机:分为类外调用和类内调用两种情况。当在类内部调用不存在的方法时,无论时对象还是类本身调用都会触发__call方法;在类外部情况下只有使用对象调用不存在的方法会调用__call方法
- 功能:看一下__call原型,__call($name, $arguments), 参数name表示的是调用的方法名,arguments为参数数组。在实际中,调用不存在的方法基本都会使用该函数来处理,这种处理大部分就是重载,针对不同的情况根据方法名和参数调用不同的函数。php7中使用AST可以使用匿名函数直接调用
__callStatic:
- 触发时机:只有一种情况,那就是在类外部使用类名调用不存在的静态方法
- 功能:与__call类似
实例:
以下实例参考上面网址的内容:
<?php
//魔术方法__call与__callStatic的区别,调用时机
class Intro
{
public function test()
{
echo 'in<br />';
static::who();
echo ' 1 ';
Intro::who();
echo ' 2 ';
self::who();
echo ' 3 ';
$this->who();
echo ' 4 ';
echo 'out<br />';
}
/**
*私有方法
*/
private function test2()
{
}
public static function __callStatic($a, $b) //类外部调用不存在的静态方法
{
var_dump('A static');
}
public function __call($a, $b) //类内部调用不存在的方法会调用__call魔术方法,$a为方法名,$b为参数,可以通过__call来实现重载
{
var_dump('A call');
}