简体   繁体   中英

PHP - Interface inheritance - declaration must be compatible

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM