描述:
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);