对于魔术方法callcallStatic-新的认识
误解的一般解释__call方法在对象方法不存在的时候被调用 __callStatic方法在调用对象静态方法不存在的时候被调用 例如 class Car{ public function __call($method,$params=[]){ echo "car call\n"; }}(new Car())->color();class Bus{ public static function __callStatic($method,$params=[]){ echo "Bus callStatic\n"; }}Bus::isSale();特殊情况其实上面的解释在某些情况下是正确的。但是在一些特殊情形,如果按照这个解释来理解,就会觉得结果不可思议了。 以下面几个例子进行说明。 __call的调用关注的是方法能不能被访问class Car{ public function __call($method,$params=[]){ echo "car call\n"; } public function color(){ echo "color red\n"; } protected function isRed(){ echo "yes is Red\n"; } public function checkColor(){ $this->color(); $this->isRed(); }}$car = new Car();$car->color();$car->isRed();$car->checkColor();输出的结果是 color redcar call isRedcolor redyes is Red从上面可以看出,其实是否调用__call,依赖的是当前调用方能否访问到要调用的函数,如果可以访问到,则直接调用函数,如果不能访问到,则调用魔术方法__call。所以,调用与否关注的是可访问性。 __callStatic关注的是方法能否被静态的方式访问接下来看另外一个静态调用的例子 class Car{ public static function __callStatic($method,$params=[]){ echo "car callStatic\n"; } public function color(){ echo "color red\n"; } protected function isRed(){ echo "yes is Red\n"; } public function checkColor(){ Car::color(); Car::isRed(); }}Car::color();Car::isRed();(new Car())->checkColor();输出内容是 ...