Phpstorm hat Inspektion: Invocation parameter types are not compatible with declared
.Aufrufparameter sind nicht kompatibel mit deklarierten
Ich war überrascht, dass PHP verwenden Basistyp als Subtyp zulassen.
interface Base
{
public function getId();
}
interface Child extends Base
{
}
interface SecondChildType extends Base
{
}
class ChildImpl implements Child
{
public function getId()
{
return 1;
}
}
class SecondChildTypeImpl implements SecondChildType
{
public function getId()
{
return 2;
}
}
class BaseService
{
public function process(Base $base)
{
$childService = new ChildService($base);
return $childService->process($base); //Invocation parameter types are not compatible with declared
}
}
class ChildService
{
public function process(Child $child)
{
return $child->getId();
}
}
class InheritanceTest extends \PHPUnit_Framework_TestCase
{
public function testInterfacesCanUsesAsSubstitute()
{
$baseService = new BaseService();
$this->assertEquals(1, $baseService->process(new ChildImpl()));
}
/**
* @expectedException \TypeError
*/
public function testInterfacesCanUsesAsSubstitute_Exception()
{
$baseService = new BaseService();
$baseService->process(new SecondChildTypeImpl());
}
}
Warum erster Test bestanden? Warum php erlaubt es?
Warum? Warum Implementierung ist wichtig? –
@ Onedev.Link Ich verstehe nicht, was Sie fragen – jszobody
Bei BaseService :: Prozess können wir nur "Base" -Objekt übergeben. Und wir übergeben "Base" -Objekt als "Child" in "ChildService :: process". Ich möchte nur "Child" oder "Child" -Subtypen in "ChildService :: process" übergeben. Aber warum kann ich 'Base' als' Kind' verwenden, verstehe ich nicht. –