The quesion is: how would one make an abstract method that can be compatible
with all extending classes that define the method using different class type
hints?
The php block below is how I thought it should work, but will give this
error at parse time:
<error>Fatal error: Declaration of DisplayObjectOne::display() must be
compatible with that of DisplayBase::display()</error>
because the hint in the concrete method is different from that in the
abstract method.
<?php
// base display class
abstract class DisplayBase {
abstract public function display(ObjectBase $object);
}
// display ObjectOne
class DisplayObjectOne extends DisplayBase {
public function display(ObjectOne $object){
print_r($object);
}
}
// display ObjectTwo
class DisplayObjectTwo extends DisplayBase {
public function display(ObjectTwo $object){
var_export($object);
}
}
// ObjectBase
class ObjectBase {
}
// ObjectOne
class ObjectOne extends ObjectBase {
public $prop = 'I am one';
}
// ObjectTwo
class ObjectTwo extends ObjectBase {
public $prop = 'I am two';
}
?>
According to the doc
<?php
function foo(ClassName $object) {
// ...
}
?>
is equivalent to:
<?php
function foo($object) {
if (!($object instanceof ClassName)) die("Argument 1 must be an instance
of ClassName");
}
?>
but if you were to run this
<?php
// ObjectBase
class ObjectBase {
}
// ObjectTwo
class ObjectTwo extends ObjectBase {
public $prop = 'I am two';
}
$ot = new ObjectTwo();
var_dump($ot instanceof ObjectBase);
var_dump($ot instanceof ObjectTwo);
?>
you would see : bool(true) bool(true)
so in theory, you should be able to rewrite the display classes as (I know
abstract classes can't have a body, but image this made sense):
<?php
// base display class
abstract class DisplayBase {
abstract public function display($object){
if (!($object instanceof ObjectBase)) die("Argument 1 must be an
instance of ObjectBase");
}
}
// display ObjectOne
class DisplayObjectOne extends DisplayBase {
public function display($object){
if (!($object instanceof ObjectOne)) die("Argument 1 must be an
instance of ObjectOne");
print_r($object);
}
}
// display ObjectTwo
class DisplayObjectTwo extends DisplayBase {
public function display($object){
if (!($object instanceof ObjectTwo)) die("Argument 1 must be an
instance of ObjectTwo");
var_export($object);
}
}
?>
does anyone agree this is a bug, if not, can you explain why this voilates
the OO-model of PHP5
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php