Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:66230 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 58590 invoked from network); 26 Feb 2013 07:25:43 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 26 Feb 2013 07:25:43 -0000 Authentication-Results: pb1.pair.com header.from=ibmurai@me.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=ibmurai@me.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain me.com designates 17.158.232.236 as permitted sender) X-PHP-List-Original-Sender: ibmurai@me.com X-Host-Fingerprint: 17.158.232.236 nk11p03mm-asmtpout001.mac.com Solaris 10 1203 Received: from [17.158.232.236] ([17.158.232.236:37531] helo=nk11p03mm-asmtp001.mac.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id E5/00-57982-4736C215 for ; Tue, 26 Feb 2013 02:25:41 -0500 Received: from [192.168.1.64] (188-182-36-146-static.dk.customer.tdc.net [188.182.36.146]) by nk11p03mm-asmtp001.mac.com (Oracle Communications Messaging Server 7u4-26.01(7.0.4.26.0) 64bit (built Jul 13 2012)) with ESMTPSA id <0MIT00LO5GM85W50@nk11p03mm-asmtp001.mac.com> for internals@lists.php.net; Tue, 26 Feb 2013 07:25:23 +0000 (GMT) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.9.8327,1.0.431,0.0.0000 definitions=2013-02-25_06:2013-02-22,2013-02-25,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 ipscore=0 suspectscore=2 phishscore=0 bulkscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=6.0.2-1203120001 definitions=main-1302250377 Content-type: text/plain; charset=us-ascii MIME-version: 1.0 (Mac OS X Mail 6.2 \(1499\)) In-reply-to: Date: Tue, 26 Feb 2013 08:25:21 +0100 Cc: "internals@lists.php.net" Content-transfer-encoding: quoted-printable Message-ID: <5F87647B-339F-48A1-82B3-E210F95766CD@me.com> References: <01F30F77-B22D-40CE-ADF1-AC1C488FE39D@me.com> To: Nikita Nefedov X-Mailer: Apple Mail (2.1499) Subject: Re: [PHP-DEV] Late FQCN resolution using ::class From: ibmurai@me.com (Jens Riisom Schultz) Ok I get that, thankyou for the explanation. static::class is not an option. I'm trying to resolve class names = defined in docblocks, since phpdoc2 allows for entering type hints = (classes) as namespace/use relative. And I can tell there is no current = way of resolving class names in strings, to FQCN's, unless I'm missing = something? (There is no way to get a list of the currently used = namespaces as far as I can tell - would such a function be possible to = add to the SPL, without any major rewriting?) So, I'm simply wondering if this would require any major rewriting to = support? Otherwise I could look into it and try to write a patch... = Because I think this would be really useful for framework developers, = php unit testing and php doc for example. -Jens On Feb 25, 2013, at 11:20 AM, Nikita Nefedov wrote: > On Mon, 25 Feb 2013 14:00:04 +0400, Jens Riisom Schultz = wrote: >=20 >> Hi everybody, >>=20 >> I have read up on this, and done some testing. >>=20 >> First up, my findings with PHP5.5 alpha5: >>=20 >> > namespace spacy; >>=20 >> class classy { >> public static function fqcn() { >> /* This works but is not useful enough: */ >> //return self::class; >>=20 >> $me =3D 'classy'; >>=20 >> /* This just doesn't work, but I wish it did: */ >> //return $me::class; >>=20 >> /* This simply does not work as expected: */ >> return eval("return $me::class;"); >> /* Output: "classy" - Expected output: "spacy\classy" = */ >> } >> } >> ?> >>=20 >> 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. >>=20 >> 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. >>=20 >> - Jens Riisom Schultz >> -- >> PHP Internals - PHP Runtime Development Mailing List >> To unsubscribe, visit: http://www.php.net/unsub.php >>=20 >=20 > Hi Jens, >=20 > Here's what happened in your code: > When you invoked fqcn(), you created var $me =3D "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.