首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

call_user_func_array不执行__callStatic魔术方法

call_user_func_array是PHP语言中的一个函数,用于调用一个回调函数,并将一个数组作为参数传递给该回调函数。它的语法如下:

代码语言:txt
复制
mixed call_user_func_array ( callable $callback , array $param_arr )

其中,$callback表示要调用的回调函数,可以是一个函数名的字符串,也可以是一个包含对象和方法名的数组。$param_arr是一个包含参数的数组。

这个函数的作用是动态地调用一个函数或方法,并将参数以数组的形式传递给它。它可以方便地实现一些动态调用的需求,比如根据不同的条件调用不同的函数。

在PHP中,__callStatic是一种魔术方法,用于在静态方法不存在时被调用。它的语法如下:

代码语言:txt
复制
public static mixed __callStatic ( string $name , array $arguments )

当我们在调用一个不存在的静态方法时,PHP会自动调用__callStatic方法,并将方法名和参数传递给它。我们可以在__callStatic方法中实现自定义的逻辑,比如动态调用其他方法。

然而,call_user_func_array函数并不会触发__callStatic方法。这是因为__callStatic方法是用于处理静态方法的调用,而call_user_func_array函数是用于调用普通的函数或方法的。所以,当我们使用call_user_func_array函数调用一个不存在的静态方法时,并不会触发__callStatic方法。

总结起来,call_user_func_array函数用于调用一个回调函数,并将一个数组作为参数传递给该回调函数。而__callStatic是一种魔术方法,用于在静态方法不存在时被调用。它们之间没有直接的联系,所以call_user_func_array函数不会执行__callStatic魔术方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

对于魔术方法__call,__callStatic 新的认识

call isRed color red yes is Red 从上面可以看出,其实是否调用__call,依赖的是当前调用方能否访问到要调用的函数,如果可以访问到,则直接调用函数,如果不能访问到,则调用魔术方法...所以,__callStatic关注的是函数在调用位置能否被静态的方式访问到。如果能访问到,则直接执行方法。...如果不能则执行__callStatic方法 __call 与__callStatic同时存在的情况 方法不可访问的时候,具体调用__call,__callStatic方法,依据的并不是调用方式是否是静态调用...color,isRed方法,上下文是静态方式,所以执行的是__callStatic。...而在checkColor方法中,调用的上下文处于当前类对象Car当中,即使是以静态方式调用color,isRed,最终执行的是__call方法

60020
  • thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析

    constructor, $vars); } else { $args = []; } return $reflect- newInstanceArgs($args); } /** * 执行函数或者闭包方法...,它继承了Facade的方法,但Facade并没有get这个静态方法 // 此时,系统自动触发了魔术方法:__callStatic(),Facade重写了此方法: public static function...__callStatic($method, $params) { return call_user_func_array([static::createFacade(), $method], $params...); } // 可见,最后调用的是用户自定义函数:call_user_func_array([实例, 方法], 参数),为了获得Config实例,Facade又定义了一个获取对象的方法: /** *...facade\Config::get('app_debug'); // 最后调用的是: (new think\Config())- get('app_debug'); 简而言之,门面的实现是通过PHP的魔术方法

    78441

    如何自动化挖掘php反序列化链 - phpunserializechain诞生记

    而php的魔术方法中涉及到反序列化的大致有以下几种: __destruct: 析构函数,会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。一般来说,也是Pop链的入口。...__call: 当调用了类对象中不存在或者不可访问的方法时触发。 __callStatic: 当调用了类对象中不可访问的静态方法时触发。...如果父类也不存在a方法(或是不可访问),那么就会触发当前类的__call魔术方法。...$this->a->b() ==> 任意类的b方法 ==> 任意类的__call方法 而__callstatic和call大同小异,唯一的区别就是当调用静态方法时触发,例如: function __destruct...为了更好的确认每种会触发魔术方法的方式。我们直接将所有的语法结构分类。

    65620

    Laravel5.2之PHP重载(overloading)

    重载(overloading) 在Laravel中就大量应用了重载相关知识,如在IlluminateSupportFacadesFacade中就用到了方法重载知识:使用魔术方法__callStatic(...PHP中通过引入魔术方法来实现动态的创建类属性和方法,包括属性重载的魔术方法方法重载的魔术方法。当然,重载是在类的外部发生的,所以所有魔术方法必须声明public,而且参数不能引用传递。...person = new Person(); $person->name = 'PHP'; echo $person->name.PHP_EOL; echo $person->sex.PHP_EOL; 如果魔术方法...上面是类属性重载,当类方法重载时,PHP提供了两个魔术方法:__call()和__callStatic(),__call()是动态创建对象方法触发,__callStatic()是动态创建类方法触发:...,必然是调用了__callStatic()方法,发现IlluminateSupportFacadesFacade这个抽象类中定义了魔术方法__callStatic(): public static function

    3.1K31

    PHP审计之POP链挖掘

    魔术方法 __wakeup() //使用unserialize时触发 __sleep() //使用serialize时触发 __destruct() //对象被销毁时触发 __call() //在对象上下文中调用不可访问的方法时触发...__callStatic() //在静态上下文中调用不可访问的方法时触发 __get() //用于从不可访问的属性读取数据 __set() //用于将数据写入不可访问的属性 __isset() //在不可访问的属性上调用...现实情况下__call的利用居多,该魔术方法触发的条件是在对象上下文中调用不可访问的方法时触发。...__callstatic方法只有在调用到静态方法的时候才能触发 __get与__set 不存在该类变量或者不可访问时,则会调用对应的__get方法 $this->a ==> 当前类a变量 ==> 父类a...串联的方法基本上就是一些魔术方法和一些自定义的方法

    69710

    PHP审计之POP链挖掘

    魔术方法# __wakeup() //使用unserialize时触发 __sleep() //使用serialize时触发 __destruct() //对象被销毁时触发 __call() //在对象上下文中调用不可访问的方法时触发...__callStatic() //在静态上下文中调用不可访问的方法时触发 __get() //用于从不可访问的属性读取数据 __set() //用于将数据写入不可访问的属性 __isset() //在不可访问的属性上调用...# 现实情况下__call的利用居多,该魔术方法触发的条件是在对象上下文中调用不可访问的方法时触发。...__callstatic方法只有在调用到静态方法的时候才能触发 __get与__set# 不存在该类变量或者不可访问时,则会调用对应的__get方法 $this->a ==> 当前类a变量 ==> 父类...串联的方法基本上就是一些魔术方法和一些自定义的方法

    84920

    PHP语言教程-魔术方法之属性重载和方法重载

    当我们试图写入一个不存在或不可见的属性时,PHP就会执行对象(类)中的__set()魔术方法方法必须接收两个参数,用来存放属性名和属性值。...当我们试图读取一个不存在或者不可见的属性时,PHP就会执行对象(类)中的__get()魔术方法。...方法重载 __call()魔术方法 __callStatic()魔术方法 示例代码: <?...当我们试图调用对象(类)中一个不存在或者不可见的方法时,PHP会执行对象(类)中的_call()魔术方法。__call()也必须接收两个参数,用来存放试图调用的方法名和要传递给该方法的参数。...如果我们试图调用对象(类)中一个不存在或者不可见的静态方法时,PHP会执行对象(类)中的__callStatic()魔术方法

    63620

    PHP基础之重载技术,你学会了吗?

    面向对象语言中,一个类有多个同名方法,每个方法参数不同,这种现象就成为"重载"。 参数不同可以指 数量、类型、顺序不同。...> 定义一个声明参数的入口函数,函数内使用func_num_args(传递给函数的参数个数)/func_get_args(传递给函数的参数数组)获取参数个数/数组,然后根据参数个数转发到具体实现的函数...> 对于类中的成员函数,可以通过__call(在一个对象的上下文中,如果调用的方法不能访问,它将被触发)和__callStatic(在一个静态的上下文中,如果调用的方法不能访问,它将被触发)实现重载。...$method; if (method_exists($this, $method)) { call_user_func_array([$this, $method], $args...php //__callStatic class AB { public static function __callStatic($method, $args) { $method = '_'

    31620

    PHP 魔术方法、序列化与对象复制

    1、概述 在 PHP 中,内置了如下魔术方法(Magic Method): __construct()、__destruct()、__call()、__callStatic()、__get()、__set...PHP_EOL; 最终的打印结果如下: 汽车品牌:领克01 汽车No.:10001 说明反序列化和所有魔术方法执行成功。...3、__call() 和 __callStatic() 当在指定对象上调用一个不存在的成员方法时,如果该对象包含 __call 魔术方法,则尝试调用该方法作为兜底,与之类似的,当在指定类上调用一个不存在的静态方法...,如果该类包含 __callStatic 方法,则尝试调用该方法作为兜底。...5、__invoke() __invoke 魔术方法会在以函数方式调用对象时执行,还是以 Car 为例,我们在其中定义 __invoke 魔术方法如下: <?

    1.9K41

    PHP中的那些魔术方法(一)

    但是,我们可以通过一些魔术方法来弥补,例如__call()方法就可以用来实现重载。 话不多说,我们一个一个的来看。...__construct()和__destruct() 这两个是非常出名并且也是非常常用的魔术方法。__construct()是构造函数。...PHP_EOL; } __call()与__callStatic() 非常重要而且也是面试时经常会问到的魔术方法。...__callStatic()则是通过静态调用时如果没有定义对应的方法,就进入到__callStatic()方法中,如A::b(),并没有定义b()方法,这时就进入了__callStatic()中进行处理...PHP_EOL; } 这篇文章主要介绍的是几个非常常用的,而且在面试时出现频率也是非常高的魔术方法。在下一篇中将会介绍其它一些出现频率较低但更有意思的魔术方法

    99020

    PHP中的12个魔术方法

    PHP中的12个魔术方法 这个标题有点牵强因为php有不只12种魔术方法, 但是这些将会引导你使用php魔术方法一个好的开始。它可能魔幻,但是并不需要魔杖。...这些'魔术'方法拥有者特殊的名字,在PHP中通常以"__"打头的方法都作为魔术方法, 所以通常不要定义以"__"开头的函数或方法。...由于并没有构造方法,PHP 会参考父类方法定义 信息来使用它因此我们能覆盖父类方法,或者,在我们的新类中-很便利。 __destruct 你发现文件句柄也是构造器一部分吗?...11、__callStatic(PHP 5.3.0以上版本有效) 它的工作方式类似于__call() 魔术方法,__callStatic() 是为了处理静态方法调用。...PHP 确实加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此... 12.

    92040

    PHP 中的魔术方法

    什么是魔术方法 ? PHP 魔术方法 官方文档 传送门 PHP 的魔术方法是指 PHP 中以两个下划线 _ 开头的类方法 我们自己在定义类方法时不能使用魔术方法的名称,除非是想使用其魔术功能 2....PHP 魔术方法 序号 方法名 描述 1 __construct 构造方法,类被实例化时执行 2 __destruct 析构方法,对象被销毁时执行 3 __call 当对象调用一个不可访问的方式时执行...4 __callStatic 以静态方式调用一个不可访问的方式时执行 5 __get 读取不可访问或不存在的属性时执行 6 __set 给不可访问或不存在的属性赋值时执行 7 __isset 当对不可访问或不存在的属性调用...isset() 或 empty() 时执行 8 __unset 当对不可访问或不存在的属性调用 unset() 时执行 9 __sleep 当对象使用 serialize() 序列化时,会先调用该方法...当对象转为字符串类型时执行 14 __invoke() 当对象被当作函数调用时执行 15 __set_state() 16 __clone() 当使用 clone 关键字 克隆对象完成后执行 17 _

    49030
    领券