On Mon, 25 Feb 2013 14:00:04 +0400, Jens Riisom Schultz <ibmu...@me.com>
wrote:
Hi everybody,
I have read up on this, and done some testing.
First up, my findings with PHP5.5 alpha5:
<?php
namespace spacy;
class classy {
public static function fqcn() {
/* This works but is not useful enough: */
//return self::class;
$me = 'classy';
/* This just doesn't work, but I wish it did: */
//return $me::class;
/* This simply does not work as expected: */
return eval("return $me::class;");
/* Output: "classy" - Expected output: "spacy\classy" */
}
}
?>
I'm trying to late resolve a class name contained in a variable to the
FQCN. I understand that this is hard (maybe even impossible) with the
current implementation, because class name resolution happens compile
time, but eval("return $me::class;") simply returns something that is
weird.
I guess what I'm trying to ask is whether it would be impossible to
support late FQCN resolution in any way? It would be very useful for
frameworks to be able to do this.
- Jens Riisom Schultz
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Hi Jens,
Here's what happened in your code:
When you invoked fqcn(), you created var $me = "classy";
Then you tried to invoke this code in eval: "return classy::class;"
But when php evals code, it's like including another file. So it executes
the code without any namespace (it's in global namespace), and php didn't
discover class with name classy (there's only spacy\classy) yet, so it
tries to resolve all your "use" statements (but you didn't write any) and
then just gives you "classy", it didn't throw any error just because it
tried to delay autoloading of this class as far as possible, if would do
eval("return new $me;") then you would get fatal error.
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php