当使用laravel的日志类记录信息的时候 Log::info("xxxx") 发现Log类里并没有定义info 静态方法,但是仍然可以调通 原因就是__callStatic魔术方法,当静态方法不存在的时候 * Class Log * @method static void info() * @see Test */ class Log{ public static function __callStatic
__callStatic关注的是方法能否被静态的方式访问 接下来看另外一个静态调用的例子 class Car{ public static function __callStatic($method 如果不能则执行__callStatic方法 __call 与__callStatic同时存在的情况 方法不可访问的时候,具体调用__call,__callStatic方法,依据的并不是调用方式是否是静态调用 __callStatic($method,$params=[]){ echo "car callStatic $method\n"; } public function color,isRed方法,上下文是静态方式,所以执行的是__callStatic。 3)具体执行__call,__callStatic,是根据调用的上下文。如果处于静态上下文内,则调用__callStatic。如果处于对象的上线文内,则调用__call
2核2G云服务器 每月9.33元起,个人开发者专属3年机 低至2.3折
php中__callStatic方法的使用 说明 1、当要调用的静态方法不存在或者权限不足时候会自动调用。 2、与__call()方法相同,接受方法名和数组作为参数。 语法 __callStatic($funcname, $arguments) 参数 $funcname String 调用的方法名称。 $arguments Array 调用方法时所带的参数。 private static function say() { echo 'hello, 我是autofelix'; } public function __callStatic 方法'; die; } } $a = new autofelix(); $a::say(); //按理说应该报错 //即可输出:你无权调用say方法 以上就是php中__callStatic
PHP_EOL; } __call()与__callStatic() 非常重要而且也是面试时经常会问到的魔术方法。 __callStatic()则是通过静态调用时如果没有定义对应的方法,就进入到__callStatic()方法中,如A::b(),并没有定义b()方法,这时就进入了__callStatic()中进行处理 在Laravel框架中,使用的Facade模式,也就是门面模式,核心代码就是使用了__callStatic()方法。有兴趣的小伙伴可以自行查看下Laravel的源码。 PHP_EOL; } public static function __callStatic($name, $arguments) { echo '===callStatic===' . ',参数是:'; print_r($arguments); echo '===callStatic===' .
但是在 laravel 中就可以,查看了下 Model 基类的代码,原来是因为实现了 __call() 和 __callStatic() 这两个魔术方法。 return $this- forwardCallTo($this- newQuery(), $method, $parameters); } public static function __callStatic $parameters); } //在静态上下文中调用一个不可访问方法时,__callStatic()被调用 public static function __callStatic($method , $parameters) { echo '__callStatic()'; //注意这里,通过延迟静态绑定,仍然new了一个实例 return (new static)-
方法重载 __call()魔术方法 __callStatic()魔术方法 示例代码: <? PHP_EOL; print_r($params); } static function __callStatic($methodName, $params) { echo '方法名:' 如果我们试图调用对象(类)中一个不存在或者不可见的静态方法时,PHP会执行对象(类)中的__callStatic()魔术方法。 __call()和__callStatic()作用: 1、防止调用不存在或者不可见的方法而报错 2、动态创建对象(类)的方法 总结 我们通过示例代码讲解了属性重载和方法重载的PHP魔术方法,在实际开发工作中
重载(overloading) 在Laravel中就大量应用了重载相关知识,如在IlluminateSupportFacadesFacade中就用到了方法重载知识:使用魔术方法__callStatic( isset($person->address).PHP_EOL; unset($person->name); 方法重载 上面是类属性重载,当类方法重载时,PHP提供了两个魔术方法:__call()和__callStatic (),__call()是动态创建对象方法触发,__callStatic()是动态创建类方法触发: class Person { private $sex; public function array $args) { echo $method.'/'.implode(',', $args).PHP_EOL; } public function __callStatic ()方法,发现IlluminateSupportFacadesFacade这个抽象类中定义了魔术方法__callStatic(): public static function __callStatic
学习反序列化的前提就是要对常见的魔术方法有一个了解,魔术方法目前包括16个: ```php __construct():构造函数 __destruct():析构函数 __call():当调用了一个不存在的方法时被调用 __callStatic 不存在,参数:'; print_r($value_b); echo '也不存在\n'; } } $fun = new Fun('现在我传给了$vula'); $fun->asd(1,2); ``` #__callStatic public $vula; public $vulb; public function __construct($vula){ $this->vulc=$vula; } static function __callStatic ; echo '也不存在\n'; } } $fun = new Fun('现在我传给了$vula'); $fun::asd(1,2); ``` 使用 类名::函数名 则代表着用静态方法调用,类中的__callStatic
if (isPause) { string json = "{'status':'3'}"; ajc_SDKCall.CallStatic = null){ string json = "{'status':'1'}"; ajc_SDKCall.CallStatic("uaLifeCycle ",json); json = "{'status':'2'}"; ajc_SDKCall.CallStatic("uaLifeCycle } void OnApplicationQuit() { string json = "{'status':'5'}"; ajc_SDKCall.CallStatic
> 二、方法重载 public __call(string $name, array $arguments): mixed public static __callStatic(string $name 在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。 name 参数是要调用的方法名称。 arguments 参数是一个枚举数组,包含着要传递给方法 示例1:使用 __call() 和 __callStatic() 对方法重载 <? "\n"; } public static function __callStatic($name, $arguments) { // 注意: $name 的值区分大小写
__call,__callStatic __call调用不可访问或不存在的方法时被调用 __callStatic调用不可访问或不存在的静态方法时被调用 5.
$stu->add,''; 1.6.3 __call()、__callstatic() __call():调用无法访问的方法时自动执行 __callstatic():调用无法访问的静态方法时自动执行 call($fn_name,$fn_args) { echo "{$fn_name}不存在"; } //调用无法访问的静态方法时自动执行 public static function __callstatic
Java方法调用 JNIEnv提供了众多的 Call<TYPE>Method 与 CallStatic<TYPE>Method,还有CallNonvirtual<TYPE>Method函数。 第一种是最常用的方式 第二种是当调用这个函数的时候,有一个指向参数表的va_list变量时使用(不常用) 第三种是当调用这个函数的时候,有一个指向jvalue或者jvalue数组的指针时使用 调用静态方法的三种形式 CallStatic <TYPE>Method( jclass clazz, jmethodID id, ...); CallStatic<TYPE>MethodV( jclass clazz, jmethodID id, va_list lst); CallStatic<TYPE>MethodA( jclass clazz, jmethodID id, jvalue* v); 伪代码 java: public boolean
bool(false) **/ // __call __callStatic /* mixed __call ( string $name , array $arguments ) mixed __callStatic ( string $name , array $arguments ) __call() is triggered when invoking inaccessible __callStatic() is triggered when invoking inaccessible methods in a static context. "\n"; } /** As of PHP 5.3.0 */ public static function __callStatic($name, $arguments) { echo "__callStatic, Calling static method '$name' " . implode(', ', $arguments) .
TAG_NAME = "Sample" val NON_STATIC_VALUE = "non_static_value" @JvmStatic fun callStatic } fun callNonStatic() { } } } 调用代码如下 //JVM static method Sample.callStatic
= new Car(); $car->run(1,2,3,4); //类中没有该函数,函数名为:run Array ([0] => 1[1] => 2[2] => 3[3] => 4 ) __callStatic //使用场景: __callStatic 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。 # 格式 __callStatic($functionName, $arg) 参数1为方法名 参数2 为传递参数 #完整代码 <? $functionName; echo ''; print_r($arg); } public static function __callStatic
在 Facade 类中,别的方法函数我们先不用看,直接拉到最底下,你会发现一个魔术方法,__callStatic() 。 $args); } __callStatic() 的意思是通过静态调用时如果没有定义对应的方法,就进入到 __callStatic() 方法中,比如我们调用的 Cache::get() 这个方法,实际上当前的 Cache 门面类以及它的父类 Facade 都没有定义这个方法,那么就直接进入到了 __callStatic() 中。 好了,到此为止,其实如果面试的时候有面试官问你 Laravel 中的门面模式是如何实现的时候,你就可以自信地说核心就是这个 __callStatic() 魔术方法了。 在 __callStatic() 方法中,我们会看到调用了一个 static::getFacadeRoot() 方法来获得具体的实例对象。
> 对于类中的成员函数,可以通过__call(在一个对象的上下文中,如果调用的方法不能访问,它将被触发)和__callStatic(在一个静态的上下文中,如果调用的方法不能访问,它将被触发)实现重载。 php //__callStatic class AB { public static function __callStatic($method, $args) { $method = '_'
使用unserialize时触发 __sleep() //使用serialize时触发 __destruct() //对象被销毁时触发 __call() //在对象上下文中调用不可访问的方法时触发 __callStatic 在不可访问的属性上使用unset()时触发 __toString() //把类当作字符串使用时触发,file_exists()判断也会触发 __invoke() //当脚本尝试将对象调用为函数时触发 __call与__callstatic __callstatic方法只有在调用到静态方法的时候才能触发 __get与__set 不存在该类变量或者不可访问时,则会调用对应的__get方法 $this->a ==> 当前类a变量 ==> 父类a
自动化助手(TAT)是云服务器的原生运维部署工具。通过自动化助手,您无需登录服务器,也无需打开入站端口、SSH,便可以直接管理实例,批量执行 Shell 命令,轻松完成运行自动化运维脚本、轮询进程、安装或卸载软件、更新应用以及安装补丁等常见管理任务。
扫码关注腾讯云开发者
领取腾讯云代金券