通过参数传递扩展类

时间:2014-04-21 01:20:58

标签: php class polymorphism

我有一个父类:

namespace classes;
abstract class MyParent{ abstract function name(); }

现在,两个孩子:

namespace classes;
class Foo extends MyParent{ function name(){ return "Foo class"; } }

namespace classes;
class Bar extends MyParent{ function name(){ return "Bar class"; } }

在java中,我可以这样做:

public void doSomething(AnObject <?extends MyParent?> object){ }

上面的方法可以重现从MyParent类扩展的所有对象。我怎么能在PHP中实现这一点?当然,像function doSomething($child){}一样声明函数可以解决问题,但我想指定对象的类型,如:

function doSomething(classes\{any-children-of-MyParent} $class){}

如果我function doSomething(classes\MyParent $class){}并传递Foo类的实例,我会收到此错误:

  

传递给doSomething的参数1必须是。的实例   clasess \ MyParent

2 个答案:

答案 0 :(得分:2)

你走在正确的轨道上,@ manix。

在PHP中,它完全相同。如果您希望任何类在方法中扩展父类,只需在对象名称前面指定类的名称。正如@sectus所说,这就是我们所说的type-hinting

您似乎遇到的问题是命名空间问题。关于命名空间,您需要知道如果您已经在脚本中的命名空间中,并且不使用反斜杠(\)为类名添加前缀,则命名空间将相对于您当前的名称进行解析命名空间。

这意味着如果你在

namespace Foo;

以下代码将Bar解释为Foo命名空间的一部分。

<?php

namespace Foo;

class Bar
{
    public function doSomething(Bar $bar)
    {
        // ...
    }
}

因此,如果您在同一名称空间中有另一个类

<?php

namespace Foo;

class Baz extends Bar
{
    public function doSomething(Bar $bar)
    {
        // ...
    }
}

您不需要再次指定命名空间。另一方面,如果您的班级位于另一个名称空间(请说Quz),Bar将被解析为Quz\Bar,但尚未定义。

<?php

namespace Quz;

class Baz extends Bar
{
    public function doSomething(Bar $bar)
    {
        // ...
    }
}

要解决此问题,您需要:

  • 使用use语句
  • 导入名称空间
  • 使用对Foo\Bar

    的绝对引用

    命名空间Quz;

    使用Foo \ Bar;

    班级Baz扩展了Bar {     公共功能doSomething(Bar $ bar)     {         // ...     } }

<?php

namespace Quz;

class Baz extends \Foo\Bar
{
    public function doSomething(\Foo\Bar $bar)
    {
        // ...
    }
}

对于课堂内的论点,原则完全相同。方法。哦,顺便说一下,如果你看看这里的代码,你可能会发现你可能完全做了类似的事情

<?php

$quz = new Quz\Baz();
$baz = new Foo\Baz();
$bar = new Foo\Bar();

$bar->doSomething($quz);
$bar->doSomething($bar);
$bar->doSomething($baz);

$quz->doSomething($quz);
$quz->doSomething($bar);
$quz->doSomething($baz);

$baz->doSomething($quz);
$baz->doSomething($bar);
$baz->doSomething($baz);

答案 1 :(得分:1)

你可以写这样的东西。

public function doSomething(\clases\MyParent $object){ }
                         // ^ namespace from the root.

它被称为type hinting

演示:http://3v4l.org/tqV3s