为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以覆盖PHP中的函数

是否可以覆盖PHP中的函数

PHP
慕哥6287543 2019-10-21 10:30:14
你能声明这样的函数吗?function ihatefooexamples(){  return "boo-foo!";};然后像这样重新声明它...if ($_GET['foolevel'] == 10){  function ihatefooexamples(){    return "really boo-foo";  };};这样可以覆盖函数吗?可以吗
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

编辑

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


查看完整回答
反对 回复 2019-10-21
?
呼唤远方

TA贡献1856条经验 获得超11个赞

命名空间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

     print_r($some_object);

     // do some stuff

     print_r($another_object);

     // do some other stuff

     print_r($data_object);

     // do more stuff

     print_r($debug_object);

但是您稍后改变了主意,而是希望将输出包装在<pre></pre>标签中。你曾经发生过吗?


在您进行更改之前,请更改每个呼叫,以print_r();考虑使用猴子修补程序。


例:

<?php

    namespace MyNamespace {

        function print_r($object) 

        {

            echo "<pre>", \print_r($object, true), "</pre>"; 

        }


        print_r($some_object);

        // do some stuff

        print_r($another_object);

        // do some other stuff

        print_r($data_object);

        // do more stuff

        print_r($debug_object);

    }

您的脚本现在将使用MyNamespace\print_r();而不是全局\print_r();


非常适合模拟单元测试。


欢乐!


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 1104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信