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

PHP如何调用parent :: __ call()并传入参数

在PHP中,可以使用parent::__call()方法来调用父类中的未定义方法,并传入参数。

parent::__call()方法是一个魔术方法,当调用的方法在当前类中未定义时,会自动触发该方法。它接受两个参数,第一个参数是要调用的方法名,第二个参数是一个数组,包含了传递给该方法的参数。

下面是一个示例代码:

代码语言:php
复制
class ParentClass {
    public function foo($param1, $param2) {
        echo "Calling foo() in parent class with parameters: $param1, $param2";
    }
}

class ChildClass extends ParentClass {
    public function __call($method, $args) {
        if ($method === 'foo') {
            // 调用父类的foo()方法
            parent::foo($args[0], $args[1]);
        }
    }
}

$child = new ChildClass();
$child->foo('param1', 'param2');

在上面的示例中,ChildClass继承了ParentClass,并重写了__call()方法。当调用ChildClass对象的foo()方法时,由于ChildClass中未定义该方法,会触发__call()方法。在__call()方法中,我们可以判断要调用的方法名是否是foo,如果是,则使用parent::foo()来调用父类中的foo()方法,并传入相应的参数。

这样,就实现了在子类中调用父类的未定义方法,并传递参数的功能。

推荐的腾讯云相关产品和产品介绍链接地址:

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

相关·内容

【Groovy】Groovy 脚本调用 ( 命令行执行 Groovy 脚本传入参数 | 获取 Groovy 脚本执行参数 )

文章目录 前言 一、 命令行执行 Groovy 脚本传入参数 二、获取 Groovy 脚本执行参数 前言 在 Groovy 脚本 , Groovy 类 , Java 类中 , 可以调用 Groovy...脚本 ; 一、 命令行执行 Groovy 脚本传入参数 ---- 假设现在有一个 Script.groovy 脚本 , 使用 groovy Script.groovy arg0 arg1 命令 , 执行该...Script.groovy 脚本 ; 在 Groovy 脚本后面带上 arg0 和 arg1 是脚本的执行参数 , 在 Groovy 脚本中 , 可以通过 args 获取参数 , 这是一个字符串数组...String[] 类型数据 ; 二、获取 Groovy 脚本执行参数 ---- 在 Groovy 脚本中 , 通过 String[] args 可以直接获取命令行中传入参数 ; Script.groovy...在 Groovy 脚本中 , 可以通过 args 获取参数 这是一个字符串数组 String[] 类型的 */ // 打印 Groovy 脚本参数 println "type :

2.1K10

在Python中将函数作为另一个函数的参数传入调用的方法

在Python中,函数本身也是对象,所以可以将函数作为参数传入另一函数并进行调用在旧版本中,可以使用apply(function, *args, **kwargs)进行调用,但是在新版本中已经移除,以function...== '__main__': func_a(func_b, 1, 2, 3)Output:----------(1, 2, 3)----------在代码中,将函数func_b作为函数func_a的参数传入...,将函数func_b的参数以元组args传入,并在调用func_b时,作为func_b的参数。...func中进行调用,可以正常运行,但这明显不符合设计初衷:在func_a中执行func(**kwargs)时,很可能并不知道func到底需要什么参数。...换句话说,如果已经提前知道需要调用什么函数,那完全不必要把函数作为参数传入另一个函数调用,直接调用函数即可。

10.6K20
  • PHP 面向对象篇:继承、封装与多态

    在子类 Benz 的构造函数中,我们将品牌设置为「奔驰」,然后通过 parent::__construct 调用父类的构造函数进行初始化(调用父类的同名方法需要通过 parent:: 进行调用,否则 PHP...会不知道调用父类还是子类的方法),这样,初始化 Benz 对象时,就无须传入品牌参数了。...方法完全一样,如果将 private 修改为 protected 效果也一样,通过反射,我们可以在运行时以逆向工程的方式对 PHP 类进行实例化,对类中的属性和方法进行动态调用,不管这些属性和方法是否对外公开...,然后和构造函数一样,通过 parent::drive 调用父类的同名方法,因为所有的汽车启动流程基本都是一样的。...类型转化 PHP 不像 Java 那样支持同一个类中定义多个同名方法(参数数量或类型不同,这种叫做方法重载),另外,由于子类一定包含了父类的公开方法,所以当类作为参数类型声明时,如果声明类型为父类,则可以传入子类对象

    1.1K10

    Go 语言面向对象教程 —— 通过组合实现类的继承

    还可以通过在子类中定义同名方法来覆盖父类的实现,比如这里的 Call 方法和 FavorFood 方法,当我们在 Dog 实例上调用 Call 方法或 FavorFood 方法时,调用的是 Dog 类中定义的方法而不是...我们可以这样实例化 Dog 类型调用相应的方法: animal := Animal{"狗"} dog := Dog{animal} fmt.Println(dog.GetName(), "叫声:",...dog.Call(), "喜爱的食物:", dog.FavorFood()) 对应的打印结果如下: 狗 叫声: 汪汪汪 喜爱的食物: 骨头 与 PHP 或 Java 的继承机制不同,这种组合的方式更加灵活...:", dog.FavorFood()) 结构体是值类型,如果传入值字面量的话,实际上传入的是结构体值的副本,对内存耗费更大,所以传入指针性能更好。...最后,Go 语言没有类似 PHPparent 关键字,我们可以把组合进来的类型当做子类的一个匿名字段,直接通过引用类型名调用父类被重写的方法或属性: fmt.Println(dog.Animal.name

    1K30

    【Go 语言社区】js开发积累

    call函数和apply方法的第一个参数都是要传入给当前对象的对象,及函数内部的this。后面的参数都是传递给当前对象的参数。...格式: 要继承的对象.call(当前对象); 通俗理解:当前什么对象继承"要继承的对象" 例子: function parent(){ this.a="a"; this.b="b"; } function...child(){ parent.call(this);//把this指向的内容替换成parent中this指向的内容。...关于弱类型语言的整体思考: php也是一门弱类型的语言。在调用类的时候。类名大小写是没关系的。比如,类名是Page,而使用 new page也是能够生效的。...联想到在php手册中提到一个意思,大致是:函数名不区分大小写的。也就是调用函数的时候,大小写之间的区别是不会影响使用的。 是不是可以这样理解:一般弱类型语言方法有没有括号不会受到影响。

    1K70

    Laravel 参数验证的疑与惑

    验证器怎么创建的,谁创建的 Laravel 文档调用验证器,除了通过控制器,还有就是通过Facades的方式创建验证器对象。...验证器在验证参数的过程中,如果找到匹配的验证规则,则直接进行验证。否则调用魔术方法__call查找扩展验证函数。扩展函数返回布尔值,返回true则表示验证通过,返回false表示验证失败。...if(method_exists($rule, 'setValidator')) { $rule->setValidator($this); } return parent...例如,一个验证规则如下,表示用当期类的validateMinNum对参数进行验证,那么,这样的一个功能,如何在Laravel中实现呢。...如果需要实现,则需要使用自定义验证器,将验证器传入到验证规则中去。 Laravel本身提供了ClosureValidationRule的验证规则用于处理回调函数验证规则。

    3.4K00

    JS原生方法原理探究(六)从 Babel 转译过程浅谈 ES6 实现继承的原理

    ES6 的 Class 是如何实现的 先从最简单的一个 Parent 类看起: class Parent{ constructor(){ this.a = 1...首先,它可以接受三个参数: 第一个参数: 类(这里是 Parent 类) 第二个参数:存放对象的数组,每个对象都是关于类的原型方法的特性描述对象(这里是 getB 和 getC) 第三个参数:存放对象的数组...这个函数接受两个参数,self 代表构造函数的实例,call 代表构造函数的返回值。...这里我们会看到还传入了第二个参数,这个参数是子类原型的属性的特性描述对象(descriptor),我们对 constructor 属性进行了设置,将它设置为可写、可配置,同时利用 value 修复了因重写子类原型而丢失的...这就要继续往下看了,接下来我们调用 _createSuper() 函数传入派生类(子类),这不是重点,重点是它创建返回的另一个函数 _super。

    1.1K10

    JS原生方法原理探究(六)从 Babel 转译过程浅谈 ES6 实现继承的原理

    ES6 的 Class 是如何实现的 先从最简单的一个 Parent 类看起: class Parent{ constructor(){ this.a = 1 this.getA...首先,它可以接受三个参数: 第一个参数: 类(这里是 Parent 类) 第二个参数:存放对象的数组,每个对象都是关于类的原型方法的特性描述对象(这里是 getB 和 getC) 第三个参数:存放对象的数组...这个函数接受两个参数,self 代表构造函数的实例,call 代表构造函数的返回值。...这里我们会看到还传入了第二个参数,这个参数是子类原型的属性的特性描述对象(descriptor),我们对 constructor 属性进行了设置,将它设置为可写、可配置,同时利用 value 修复了因重写子类原型而丢失的...这就要继续往下看了,接下来我们调用 _createSuper() 函数传入派生类(子类),这不是重点,重点是它创建返回的另一个函数 _super。

    1.1K20

    深入解读 iView,解耦令人头疼的高度耦合复杂逻辑

    所以这里的 stateTree 实际上就是调用树组件的时候从最外层使用者传递进来的参数。 ? 但是在打印 data 的时候,我们却发现,输出的对象并不是初次调用的时候传入的 data2。如下图: ?...对于 call() 方法而言,第一个参数是 this 值没有变化,变化的是其余参数都直接传递给函数。换句话说,在使用 call() 方法时,传递给函数的参数必须逐个列举出来。...跟踪对应的 $emit 的方法看到内部的参数监视: ? 参数传递进来,并且取得后,遍历事件,使用 invokeWithErrorHandling 执行带有异常捕获处理的方法。...handler.apply(context, args) : handler.call(context); args 为上文传入的 args 参数。...handler 对应于 cbs[i],也就是对应的事件,就是说如果有参数传递,使用 apply 触发 handler 事件,反之,使用 call 直接调用

    2.2K30

    关于Laravel参数验证的一些疑与惑

    验证器怎么创建的,谁创建的 Laravel 文档调用验证器,除了通过控制器,还有就是通过Facades的方式创建验证器对象。...验证器在验证参数的过程中,如果找到匹配的验证规则,则直接进行验证。否则调用魔术方法__call查找扩展验证函数。扩展函数返回布尔值,返回true则表示验证通过,返回false表示验证失败。...rule) { if(method_exists($rule, 'setValidator')) { $rule- setValidator($this); } return parent...例如,一个验证规则如下,表示用当期类的validateMinNum对参数进行验证,那么,这样的一个功能,如何在Laravel中实现呢。...如果需要实现,则需要使用自定义验证器,将验证器传入到验证规则中去。 Laravel本身提供了ClosureValidationRule的验证规则用于处理回调函数验证规则。

    6.6K31

    滴滴前端一面高频手写面试题汇总_2023-02-28

    ,柯里化是一个高阶函数 每次都返回一个新函数 每次入参都是一个 当柯里化函数接收到足够参数后,就会执行原函数,如何去确定何时达到足够的参数呢?...const curry = (fn, arr = []) => {// arr就是我们要收集每次调用传入参数 let len = fn.length; // 函数的长度,就是参数的个数...return function(...args) { let newArgs = [...arr, ...args] // 收集每次传入参数 // 如果传入参数个数等于我们指定的函数参数个数...不用Child.prototype = new Parent()的原因是会调用2次父类的构造方法(另一次是call),会存在一份多余的父类实例属性 3....Object(this); const len = O.length >>> 0; for (let i = 0; i < len; i++) { if (i in O) { // 调用回调函数传入新数组

    70210

    ThinkCMF 前台模板注入 RCE

    function get($name = '') // 取得模板显示变量的值 public function __isset($name) // 检测模板变量的值 public function __call...模板显示 调用内置的模板引擎显示方法, * @access protected * @param string $templateFile 指定要调用的模板文件 * 默认为空 由系统自动定位模板文件...'') { G('viewStartTime'); // 视图开始标签 Hook::listen('view_begin', $templateFile); // 解析获取模板内容...>'); fetch 有了上面的铺垫,fetch 这里分析起来就更简单了,而且不再需要传 templateFile 参数。...这种标签被过滤掉了,确实可以通过模板标签 解析来绕一下。 如何防御?最简单的就是将这些本不该 public 的方法“私有化”,最好的还是将传入参数尖括号编码。

    1.4K20
    领券