对于魔术方法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();输出内容是 ...

October 14, 2019 · 1 min · jiezi

PHP-74-新特性

PHP 7.4 计划在2019年11月21日发布,它主要新增了以下几个特性: 短闭包函数(short closure)预加载提交性能属性类型限定Improved type variance(不会翻译)三元运算简写数组展开运算新增类的魔术方法:serialization数字分隔符运算优先顺序允许在__toString中抛出异常支持反射引用新增字节分割函数移除php短标签弃用左关联运算符不再向后兼容的变更短闭包函数短闭包函数可以减少冗余代码: array_map(function (User $user) { return $user->id; }, $users)array_map(fn(User $user) => $user->id, $users)需要注意几点: 短闭包可以直接访问闭包函数外面的变量,所以不需要再写 use 关键词以fn关键词开始$this 可以像普通的闭包一样使用短闭包只有一行代码,仅仅做返回声明使用,不允许使用return 关键词还可以使用更严格类型的方式 $ids = array_map(fn(User $user): int => $user->id, $user);预加载PHP预加载可以极大的提高性能 优点:在PHP 7.4以前,如果你使用了框架来开发,每次请求文件就必须加载和重新编译。预加载在框架启动时在内存中加载文件,而且在后续请求中永久有效。 缺点:性能的提升会在其他方面花费很大的代价,每次预加载的文件发生改变时,框架需要重新启动。 属性类型限定class A{ public string $name; public Foo $foo;}不得不说,PHP越来越接近Java等强类型语言 Improved type variance协变返回类型: class ParentType {}class ChildType extends ParentType {}class A{ public function covariantReturnTypes(): ParentType { /* … */ }}class B extends A{ public function covariantReturnTypes(): ChildType { /* … */ }}依赖(是不是很熟悉): ...

June 22, 2019 · 1 min · jiezi