【问题标题】:How to call a Function with Arguments in a Function with Arguments如何在带参数的函数中调用带参数的函数
【发布时间】:2016-11-13 01:40:27
【问题描述】:

我怀疑也许有人可以在这里回答。 我的代码运行良好,但我很确定,我做错了。 必须有一种更简单、更清洁的方法来实现它。

假设这个类:

class myClass {
    public static function myFunctionOne ($arg_one, $arg_two, $arg_tree) {
        echo $arg_one;
        myClass::$arg_two($arg_tree);
    }
    public static function myFunctionTwo ($arg_four) {
        echo $arg_four;
    }
}

然后你在某个地方调用上面的类(我的例子是一个内置在 PHP 文件中的 HTML 菜单),如下所示:

myClass::myFunctionOne('echo a string', 'myFunctionTwo', 'echo forth value');

这很好用,它会输出:

echo a string echo forth value

但这合法吗?

对我来说它看起来很粗略。 我可以使用这样的函数,在带参数的函数中调用带参数的函数吗?

【问题讨论】:

  • 是的,它是合法的。像这样,您可以根据用户输入动态调用函数。你不妨看看php.net/manual/de/function.call-user-func.php。另一个问题是:你真的需要动态函数调用吗?大多数不是
  • 嗯,我几乎可以肯定,我可以做不同的事情,但上面的案例只是我正在做的总结 sn-p。我目前正在尝试学习一些 OOP(是的,以上都是我假设的 OOP :P)。以上只是更大的 Bootstrap Accordion 的一小部分,我想在其中创建 Tab id 和 href,但也只需更改 args 就可以将具有相同功能的主体和菜单标题合二为一。可能有更好的方法,但人们会在途中学习 :) 非常感谢您确认这是一种合法的方法,而不是“随便用”的情况 :)
  • 不好的方法。只有静态方法的类可以有隐藏的依赖关系。
  • @RomanPerekhrest 这就是我问的原因。你能详细说明一下吗?对不起,我是OOP的初学者
  • 另外,您的代码不会验证 myClass::$arg_two 方法是否在 myClass 上定义

标签: php function class arguments


【解决方案1】:

你能做到吗?绝对地。你应该这样做吗?也许不会。

在 PHP 中,这称为Variable Functions。基本上,任何带有( 的变量都将用作要调用的函数或方法的名称。

如果需要传递多个参数,可以将final函数的参数作为数组传递,然后在调用final变量函数时解包数组。

但是,由于其他原因,它可能不是一个很好的设计模式,这可能会使代码难以维护。这可能违反了Abstraction 的原则,因为myClass::myFunctionOne() 的调用者必须知道myClass 具有哪些方法/函数以及它们采用哪些参数。

请注意,我在这里使用术语“函数”,但如果它在类中,则称为“方法”。

【讨论】:

  • 请注意,您也可以使用self:: myFunctionOne() 代替myClass:: myFunctionOne()
  • 但是 self:: 只能在课堂内工作,对吧?我在一个单独的文件中调用这个类。
  • 正确。 self:: 仅适用于班级内部,就像您的示例一样。因此,请按照您所说的外部静态调用的方式保留它。
猜你喜欢
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多