I have the interface:
interface AbstractMapper
{
public function objectToArray(ActiveRecordBase $object);
}
And classes:
class ActiveRecordBase
{
...
}
class Product extends ActiveRecordBase
{
...
}
========
But I can't do this:
interface ExactMapper implements AbstractMapper
{
public function objectToArray(Product $object);
}
or this:
interface ExactMapper extends AbstractMapper
{
public function objectToArray(Product $object);
}
I've got the error " declaration must be compatible "
So, is there a way to do this in PHP?
No, an interface must be implemented exactly . If you restrict the implementation to a more specific subclass, it's not the same interface/signature. PHP doesn't have generics or similar mechanisms.
You can always manually check in code, of course:
if (!($object instanceof Product)) {
throw new InvalidArgumentException;
}
Another way of implementing this would be:
class Executor
{
public function objectToArray(AbstractMapper $var)
{
$this->convert($var);
}
private function convert(Product $var)
{
...
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.