php利用__callStatic静态调用同类中非静态方法

29 篇文章 2 订阅
15 篇文章 1 订阅

描述:

php静态调用非静态方法

场景:项目中将请求参数一到达就实例化封装为request类,想在业务其他地方通过Request::ip()静态方式获取数据

实现方式想到了两种,

其一,利用反射机制做静态代理,将当前实例化对象反射出来,获取到相关数据

 示例

$request = new Request($message);
            $getFileMethod = (new \ReflectionObject($request))->getMethod($method);
            $getFileMethod->invoke($request,$args);

其二,利用魔术方法__callStatic,当类静态调用时去调用对用非静态方法,

public static function __callStatic($method,$args)
    {
        $res = call_user_func_array([self::$_instance, $method], $args);
        return $res;

    }

测试得知,当类中非静态函数a()存在时,静态调用A::a()会报错不能静态调用,Deprecated: Non-static method lib\Request::action() should not be called statically ,因此,__callStatic没有被触发,

解决方法,静态调用的时候,方法名前加上下划线,这样就能触发,__callStatic里去掉下划线后调用对用非静态方法,

public static function __callStatic($method,$args)
    {
        $method = explode('_',$method)[1];
        $res = call_user_func_array([self::$_instance, $method], $args);
        return $res;

    }

调用

$a = Request::_param();
        var_dump($a);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flysnownet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值