当前位置: 首页 > 面试题库 >

是否可以覆盖PHP中的函数

祁乐邦
2023-03-14
问题内容

你能 声明这样 的函数吗?

function ihatefooexamples(){
  return "boo-foo!";
};

然后像这样 重新声明 它…

if ($_GET['foolevel'] == 10){
  function ihatefooexamples(){
    return "really boo-foo";
  };
};

这样可以覆盖函数吗?

可以吗


问题答案:

编辑

解决此答案未直接解决原始问题的评论。如果您是通过Google搜索到达的,请从此处开始

有一个名为override_function的函数可以实际使用。但是,由于此函数是Advanced PHP
Debugger扩展的一部分,因此很难override_function()为生产使用提供参数。因此,我要说“否”,不可能以原始提问者的意图来覆盖函数。

原始答案

在这里,您应该利用OOP,特别是多态性。

interface Fooable
{
    public function ihatefooexamples();
}

class Foo implements Fooable
{
    public function ihatefooexamples()
    {
        return "boo-foo!";
    }
}

class FooBar implements Fooable
{
    public function ihatefooexamples()
    {
        return "really boo-foo";
    }
}

$foo = new Foo();

if (10 == $_GET['foolevel']) {
    $foo = new FooBar();
}

echo $foo->ihatefooexamples();


 类似资料:
  • 问题内容: 在Java中是否可以覆盖Objects数组的toString? 例如,假设我创建了一个简单的类(由于这是一个普遍的问题,所以实际上是哪个类并不重要)。客户端一旦创建了一个数组并使用了它,是否有可能不打印该数组的地址,而是打印一个定制的? PS:当然,我不能只在类中重写它,因为它与单个实例有关。 问题答案: 不会。您当然可以创建一个静态方法User.toString(User []),但

  • 问题内容: 我所知道的是,编译器在字节码中编写了一个默认的无参数构造函数。但是,如果我们自己编写,则该构造函数会自动调用。这种现象是构造函数压倒一切的吗? 问题答案: 您所描述的不是最重要的。如果您未指定默认构造函数,则编译器将创建一个默认构造函数。如果是子类,它将调用默认的父构造函数(super()),还将所有实例变量初始化为由该类型的默认值确定的默认值(数字类型为0,布尔值为false,对象为

  • 问题内容: 我正在使用Sphinx的autodoc插件来自动记录一组模块。我有一个函数accepts ,我想重写文档以显示Python stdlib文档使用的稍微更好的样式。 是否可以覆盖特定功能的自动文档输出? 问题答案: 可以使用以下方法覆盖签名: 但是,具有覆盖签名的函数不会与通过引入的其他函数进行排序。对每个函数使用显式指令可以解决此问题: 加成 您还可以附加到文档字符串: 要覆盖签名和文

  • 问题内容: 当我在JavaScript程序中找到一个对象时,我只会看到输出,这对于弄清楚它是什么对象(甚至是什么类型的对象)不是很有帮助。 在C#中,我习惯于重写以能够自定义对象的调试器表示形式。我可以用JavaScript做类似的事情吗? 问题答案: 您也可以在Javascript中覆盖。参见示例: 见这对如何在JavaScript中确定对象类型名称的讨论。

  • 问题内容: 您可以在Python中执行此操作,但是在PHP中可以吗? 例如: 问题答案: 这 有点 晚了,但我只想指出,自PHP 5.3起,实际上有可能在不使用PHP扩展的情况下覆盖内部函数。 诀窍是您可以在名称空间内重新定义内部PHP函数。它基于PHP对函数进行名称解析的方式: 在名称空间(例如A \ B)内部,对不合格函数的调用在运行时解决。解决调用foo()的方法如下: 它从当前名称空间中查

  • 假设我有一个这样的类: 假设我稍后创建了一个Foo对象,并选择覆盖f1的方法定义,如下所示: 如果我尝试: 我得到: 当然,我正努力让“我的f1”出版。我也希望f1是可选的。这是怎么回事?有没有可能在namedtuple中定义一个方法的默认实现,然后在new中重写它?