3 回答
![?](http://img1.sycdn.imooc.com/533e4c2300012ab002200220-100-100.jpg)
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();
![?](http://img1.sycdn.imooc.com/545867280001ed6402200220-100-100.jpg)
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();
非常适合模拟单元测试。
欢乐!
- 3 回答
- 0 关注
- 1104 浏览
添加回答
举报