Derick Rethans wrote:
> I've been working on some code, while developing on PHP 5.3. The code 
> resembles the following structure:
> 
> <?php
> interface ezcSearchQuery
> {
>     public function limit( $limit, $offset = '' );
> }
> 
> class ezcSearchFindQuerySolr implements ezcSearchQuery
> {
>     public function limit( $limit = 10, $offset = 0 )
>     {
>         $this->limit = $limit;
>         $this->offset = $offset;
>     }
> }
> ?>
> 
> No problems at all while development, no warnings, no errors. Now when I 
> deployed this on a PHP 5.2 machine it bombed out, with the following 
> *correct* message:

I disagree, the error message with 5.2 was wrong IMHO, see below for reason.

> Fatal error: Declaration of ezcSearchFindQuerySolr::limit() must be 
> compatible with that of ezcSearchQuery::limit() in /tmp/tmp/index.php on 
> line 11
> 
> And this really sucks. I made a mistake in my code (wrongly implemented 
> interface) and I get no warning (not even E_STRICT)... and then deploy 

Can you elaborate in how your implementation is wrong?
ezcSearchFindQuerySolr accepts the same arguments ezcSearchQuery does so
it is a valid implementation of the interface.

Every user of the ezcSearchQuery interface can be given an instance of
ezcSearchFindQuerySolr and it will work, so the
http://en.wikipedia.org/wiki/Liskov_substitution_principle is fulfilled.

This principle does not mean that all users of a specific implementation
have to be able to be given another implementation of the interface and
be happy with it. You can e.g. have
class ezcOrderedSearchQuery implements ezcSearchQuery
{
    public function limit( $limit, $offset = 0, $order = "ASC" )
    {
...
    }
}

class ezcFilteredSearchQuery implements ezcSearchQuery
{
    public function limit( $limit, $offset = 0 )
    {
...
    }

    public function filter( $filter )
    {
    }
}

... which are in the same boat: ezcOrderedSearchQuery and
ezcFilteredSearchQuery can be used as ezcSearchQuery but not necessarily
the other way around.

- Chris

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to