是否可以覆盖PHP中的函数

你能声明这样的函数吗?


function ihatefooexamples(){

  return "boo-foo!";

};

然后像这样重新声明它...


if ($_GET['foolevel'] == 10){

  function ihatefooexamples(){

    return "really boo-foo";

  };

};

这样可以覆盖函数吗?


可以吗


慕哥6287543
浏览 1105回答 3
3回答

慕哥9229398

编辑解决此答案未直接解决原始问题的评论。如果您是通过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();

呼唤远方

命名空间php> = 5.3中的Monkey补丁与修改解释器相比,更容易避免的方法是猴子补丁。猴子补丁是用您自己的类似“补丁”代替实际实现的艺术。忍者技能在像PHP Ninja这样的猴子补丁之前,我们首先必须了解PHP名称空间。从PHP 5.3开始,我们就引入了名称空间,乍一看,它们可能等同于类似Java包的名称空间,但是并不完全相同。在PHP中,命名空间是一种通过创建焦点层次结构来封装范围的方法,尤其是对于函数和常量。作为本主题,回退到全局功能旨在说明。如果调用函数时未提供名称空间,则PHP首先在当前名称空间中查找,然后向下移动层次结构,直到找到在该前缀名称空间中声明的第一个函数并执行该功能。对于我们的示例,如果您print_r();要从namespace My\Awesome\Namespace;PHP的作用中进行调用,则首先要查找一个名为的函数,My\Awesome\Namespace\print_r();然后My\Awesome\print_r();再My\print_r();寻找该函数,直到在全局名称空间中找到PHP内置函数为止\print_r();。您将无法function print_r($object) {}在全局名称空间中定义a ,因为这将导致名称冲突,因为具有该名称的函数已经存在。期望出现致命错误,例如:Fatal error: Cannot redeclare print_r()但是,没有什么可以阻止您在命名空间范围内仅执行此操作。修补猴子假设您有一个使用多个print_r();调用的脚本。例:<?php&nbsp; &nbsp; &nbsp;print_r($some_object);&nbsp; &nbsp; &nbsp;// do some stuff&nbsp; &nbsp; &nbsp;print_r($another_object);&nbsp; &nbsp; &nbsp;// do some other stuff&nbsp; &nbsp; &nbsp;print_r($data_object);&nbsp; &nbsp; &nbsp;// do more stuff&nbsp; &nbsp; &nbsp;print_r($debug_object);但是您稍后改变了主意,而是希望将输出包装在<pre></pre>标签中。你曾经发生过吗?在您进行更改之前,请更改每个呼叫,以print_r();考虑使用猴子修补程序。例:<?php&nbsp; &nbsp; namespace MyNamespace {&nbsp; &nbsp; &nbsp; &nbsp; function print_r($object)&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo "<pre>", \print_r($object, true), "</pre>";&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; print_r($some_object);&nbsp; &nbsp; &nbsp; &nbsp; // do some stuff&nbsp; &nbsp; &nbsp; &nbsp; print_r($another_object);&nbsp; &nbsp; &nbsp; &nbsp; // do some other stuff&nbsp; &nbsp; &nbsp; &nbsp; print_r($data_object);&nbsp; &nbsp; &nbsp; &nbsp; // do more stuff&nbsp; &nbsp; &nbsp; &nbsp; print_r($debug_object);&nbsp; &nbsp; }您的脚本现在将使用MyNamespace\print_r();而不是全局\print_r();非常适合模拟单元测试。欢乐!
打开App,查看更多内容
随时随地看视频慕课网APP