我有一个父类:
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
答案 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