From:             webmaster at domiwitt dot de
Operating system: Win XP Professional
PHP version:      5.1.2
PHP Bug Type:     Class/Object related
Bug description:  Inherited methods cannot specialize/change type hints

Description:
------------
On an inherited methods that uses parameter type hints it is not possible
to specialize a type hint. By "specialize" I mean that the type hint on
the inheriting class's method is able to type check an inherited class of
the previous type hint.

I have found several cases, where this behaviour would be extemely useful.
The Specification Pattern poses a good example.

Certainly you can work around it by not using type hints and do some
"instanceof" or "get_class()" checking inside, throwing an exception in
unwanted cases. It would however be nice if the language itself could
support such a behaviour.

Reproduce code:
---------------
<?php

interface ISpecification {
    
    public static function isSpecifiedBy($object);
    
}

class FooSpecification implements ISpecification {

    public  static function isSpecifiedBy($object) {
        echo get_class($object);
    }

}

class BarSpecification implements ISpecification {

    public static function isSpecifiedBy($object) {
        echo get_class($object);
    }

}

class Foo { }

class Bar extends Foo { }

FooSpecification::isSpecifiedBy(new Foo());
BarSpecification::isSpecifiedBy(new Bar());

?>

Expected result:
----------------
For this not to throw a compile time error

Actual result:
--------------
Fatal error: Access level to FooSpecification::isSpecifiedBy() must be
public (as in class ISpecification) in [...] on line 9

-- 
Edit bug report at http://bugs.php.net/?id=36601&edit=1
-- 
Try a CVS snapshot (PHP 4.4): 
http://bugs.php.net/fix.php?id=36601&r=trysnapshot44
Try a CVS snapshot (PHP 5.1): 
http://bugs.php.net/fix.php?id=36601&r=trysnapshot51
Try a CVS snapshot (PHP 6.0): 
http://bugs.php.net/fix.php?id=36601&r=trysnapshot60
Fixed in CVS:                 http://bugs.php.net/fix.php?id=36601&r=fixedcvs
Fixed in release:             
http://bugs.php.net/fix.php?id=36601&r=alreadyfixed
Need backtrace:               http://bugs.php.net/fix.php?id=36601&r=needtrace
Need Reproduce Script:        http://bugs.php.net/fix.php?id=36601&r=needscript
Try newer version:            http://bugs.php.net/fix.php?id=36601&r=oldversion
Not developer issue:          http://bugs.php.net/fix.php?id=36601&r=support
Expected behavior:            http://bugs.php.net/fix.php?id=36601&r=notwrong
Not enough info:              
http://bugs.php.net/fix.php?id=36601&r=notenoughinfo
Submitted twice:              
http://bugs.php.net/fix.php?id=36601&r=submittedtwice
register_globals:             http://bugs.php.net/fix.php?id=36601&r=globals
PHP 3 support discontinued:   http://bugs.php.net/fix.php?id=36601&r=php3
Daylight Savings:             http://bugs.php.net/fix.php?id=36601&r=dst
IIS Stability:                http://bugs.php.net/fix.php?id=36601&r=isapi
Install GNU Sed:              http://bugs.php.net/fix.php?id=36601&r=gnused
Floating point limitations:   http://bugs.php.net/fix.php?id=36601&r=float
No Zend Extensions:           http://bugs.php.net/fix.php?id=36601&r=nozend
MySQL Configuration Error:    http://bugs.php.net/fix.php?id=36601&r=mysqlcfg

Reply via email to