关于__callStatic 的用法

我定义了一个函数

<?php
namespace App\Libraries;

class Library
{
    function __call($name, $arguments)
    {

        echo 111;
    }

    public static function __callStatic($method, $parameters)
    {
        echo 222;
    }

    public function abc()
    {
        echo 333;
    }
}

我是这样子调用的

Library::abc();

报错

Non-static method App\\Libraries\\Library::abc() should not be called statically

按理说不是可以调用到__callStatic方法吗?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 4
xianyunyehe

魔术call 当前是当你的方法不存在的时候,才会调用,你的类中含有 abc 方法,肯定不走魔术了

4年前 评论
auithira 2年前
_杭城浪子 4年前
半人间 (楼主) 4年前
xianyunyehe (作者) 4年前

你改成

Library::EDF(); 

就走 __callStatic 的魔术方法了

$class = new Library();
$class->abc(); // 走 abc
$class->edf(); // 走 __call
4年前 评论
半人间 (楼主) 4年前

可以看下laravel 门面的实现

4年前 评论
class Taylor{
    public function __call($method, $parameters){
        return (new Otwell)->$method(...$parameters);
    }
    public static function __callStatic($method, $parameters){
         return (new static)->$method(...$parameters);
    }
}

class Otwell{
    public function foo($name , $age){
         dump($name,$age);
    }
}

Taylor::foo('taylor',17);
(new Tarylor())->foo('taylor',16);
4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!