我可以在子命名空间中执行父方法吗?

时间:2014-02-01 13:26:20

标签: php namespaces

我的命名空间栏中有一个类Foo:

namespace Bar;
class Foo
{
    public function main()
    {
        // This will be Bar\Biz
        return new Biz();
    }
}

main()方法返回类Bar \ Biz

除了返回MyBar \ Biz而不是Bar \ Biz之外,我想扩展这个类而不做任何更改。我可以这样做:

namespace MyBar;
class myFoo extends Bar\Foo
{
    public function main()
    {
        // This will be MyBar\Biz
        return new Biz();
    }
}

方法main()与父方法相同。它恰好在不同的命名空间中运行。这很有效。

但是,main()是一个冗长而复杂的方法,我不想复制它的所有代码,并且必须使我的副本与我重写的源类保持同步。有没有办法在不必复制代码的情况下执行此操作?

我使用的是PHP5.4,但是如果有不能在5.4中完成的PHP的更新版本的解决方案我会感兴趣(我知道5.6中有某种“导入”可能是溶液?)

1 个答案:

答案 0 :(得分:1)

将结果提取到自己的函数中,然后重写它。

namespace Bar;
class Foo
{
    public function main()
    {
        // lots of logic
        return create();
    }

    protected function create() 
    {
        return new Biz();
    }
}


namespace MyBar;
class myFoo extends Bar\Biz
{
    protected function create()
    {
        return new Biz();
    }
}