Hi.
Running 5.3.0alpha3 now and converting our codebase to the new
namespaces syntax. Works fine so far, the new name resolution rules are
very usable and lead to cleaner code so far. :)
Now I ran into a problem. We have a class extending ReflectionProperty,
and I got a complaint about the signature of our getValue() not matching
that of the parent class. Ok, I added that stdclass type hint, fine. I
thought.
Later on it turned out that I need to make that type hint \stdclass as
our code is namespaced and I got an error because My\NS\stdclass could
not be found. Now I got that signature mismatch warning again. Bummer. I
decided to build a small test case, and now the fun starts.
According to the manual and the PHP source the signature is this:
public function getValue(stdclass $object)
This is my test code:
---- snip ----
<?php
class PropertyReflection extends ReflectionProperty {
public function getValue(stdclass $object) {}
}
?>
---- snip ----
and the result of running that is:
---- snip ----
Declaration of PropertyReflection::getValue() should be compatible with
that of ReflectionProperty::getValue()
---- snip ----
I get that result even when using
- no type hint
- stdClass
The result stays the same when adding a namespace declaration and
adjusting the typehint variations accordingly.
Can anybody shed some light on this? Or should I file a bug report right
away?
Thanks,
Karsten
Hi!
According to the manual and the PHP source the signature is this:
public function getValue(stdclass $object)
Manual is unfortunately not exact in this point - true signature for it
is public function getValue([object $object]) - i.e. $object is not
required and if it's supplied, it doesn't have to be stdclass - any
object will do. Thus, engine correctly complains that your signature -
required object of stdclass - is not compatible.
This is my test code:
---- snip ----
<?php
class PropertyReflection extends ReflectionProperty {
public function getValue(stdclass $object) {}
}
?>
Use public function getValue($object = null) {} instead.
Stanislav Malyshev, Zend Software Architect
stas@zend.com http://www.zend.com/
(408)253-8829 MSN: stas@zend.com
Hello Stanislav,
Monday, December 8, 2008, 4:50:52 PM, you wrote:
Hi!
According to the manual and the PHP source the signature is this:
public function getValue(stdclass $object)
Manual is unfortunately not exact in this point - true signature for it
is public function getValue([object $object]) - i.e. $object is not
required and if it's supplied, it doesn't have to be stdclass - any
object will do. Thus, engine correctly complains that your signature -
required object of stdclass - is not compatible.
Which reminds me that we still have no way to do that in userland.
In userland you cannot write:
function foo(Object $bla = NULL).
The missing part is 'Object' as a type hint. I once long ago suggested
using 'class' as in 'any class member'. But people felt it wouldn't be
self explanatory enough. And unfortunately we cannot use 'Object' for
obvious reasons. We simply cannot turn that into a reserved word not
can we expect no one to have a class named Object already.
So my suggestion holds: Let's add type hint 'class' to allow hints for
objects.
marcus
This is my test code:
---- snip ----
<?php
class PropertyReflection extends ReflectionProperty {
public function getValue(stdclass $object) {}
}
?>
Use public function getValue($object = null) {} instead.
Stanislav Malyshev, Zend Software Architect
stas@zend.com http://www.zend.com/
(408)253-8829 MSN: stas@zend.com
Best regards,
Marcus
Which reminds me that we still have no way to do that in userland.
In userland you cannot write:
function foo(Object $bla = NULL).
The missing part is 'Object' as a type hint. I once long ago suggested
using 'class' as in 'any class member'. But people felt it wouldn't be
self explanatory enough. And unfortunately we cannot use 'Object' for
obvious reasons. We simply cannot turn that into a reserved word not
can we expect no one to have a class named Object already.So my suggestion holds: Let's add type hint 'class' to allow hints for
objects.marcus
This is my test code:
---- snip ----
<?php
class PropertyReflection extends ReflectionProperty {
public function getValue(stdclass $object) {}
}
?>Use public function getValue($object = null) {} instead.
Stanislav Malyshev, Zend Software Architect
stas@zend.com http://www.zend.com/
(408)253-8829 MSN: stas@zend.comBest regards,
Marcus
I don't think having a Object class built in is such a big issue with
namespaces around. Anyone using object type-hinting should have a clue.
--
Rodrigo Saboya
Hello Rodrigo,
Monday, December 8, 2008, 5:48:00 PM, you wrote:
Which reminds me that we still have no way to do that in userland.
In userland you cannot write:
function foo(Object $bla = NULL).
The missing part is 'Object' as a type hint. I once long ago suggested
using 'class' as in 'any class member'. But people felt it wouldn't be
self explanatory enough. And unfortunately we cannot use 'Object' for
obvious reasons. We simply cannot turn that into a reserved word not
can we expect no one to have a class named Object already.So my suggestion holds: Let's add type hint 'class' to allow hints for
objects.marcus
This is my test code:
---- snip ----
<?php
class PropertyReflection extends ReflectionProperty {
public function getValue(stdclass $object) {}
}
?>Use public function getValue($object = null) {} instead.
Stanislav Malyshev, Zend Software Architect
stas@zend.com http://www.zend.com/
(408)253-8829 MSN: stas@zend.comBest regards,
Marcus
I don't think having a Object class built in is such a big issue with
namespaces around. Anyone using object type-hinting should have a clue.
I am not speaking of a built-in object class. Because that is not what the
internal parsing does. The internal parsing checks whether a passed-in
argument is an instance of any class or not. And we can never have one base
class. The engine simply would not allow that becasue it can take instances
created from classes provided by different back-ends including other
lanugae runtimes.
--
Rodrigo Saboya
Best regards,
Marcus
Hi!
I am not speaking of a built-in object class. Because that is not what the
internal parsing does. The internal parsing checks whether a passed-in
Right now internal parser is quite detached from what PHP functions
could do. If someone would write a proposal to bring them closer
together (including all the things like conversions, maybe even combined
types like "array or object" :) then I think it'd be cool.
--
Stanislav Malyshev, Zend Software Architect
stas@zend.com http://www.zend.com/
(408)253-8829 MSN: stas@zend.com
Hi.
Stanislav Malyshev wrote:
According to the manual and the PHP source the signature is this:
public function getValue(stdclass $object)
...
Use public function getValue($object = null) {} instead.
Thanks, that works! I saw the [] in the C source, but failed to draw the
right conclusion...
Regards,
Karsten
PS: Having a way to type hint on any object would be cool!