#46304 [Bgs]: definening namespaced constant using define() defines CASE SENSITIVE namespace
| From: | kenashkov at gmail dot com | Date: | Wed, 15 Oct 2008 16:08:05 +0000 |
| Subject: | #46304 [Bgs]: definening namespaced constant using define() defines CASE SENSITIVE namespace | ||
| References: | 1 | Groups: | php.doc.bugs |
| Request: | Send a blank email to doc-bugs+get-1206@lists.php.net to get a copy of this message | ||
ID: 46304
User updated by: kenashkov at gmail dot com
Reported By: kenashkov at gmail dot com
Status: Bogus
-Bug Type: Scripting Engine problem
+Bug Type: Documentation problem
Operating System: GNU/Linux debian lenny
PHP Version: 5.3CVS-2008-10-15 (snap)
New Comment:
I know it is during runtime, but instead of marking it as bogus, would
be better to document it.
I'm changing the category.
This behaviour has to be documented, or fixed. Is it possible to remap
to lowercase internally the result of the
define('CaSe::Sensitive::const')? Or is undesirable from consistant POV?
Previous Comments:
------------------------------------------------------------------------
[2008-10-15 15:57:01] felipe@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
The define() works in runtime.
------------------------------------------------------------------------
[2008-10-15 15:39:29] kenashkov at gmail dot com
<?
namespace NS1::ns2;
const const2 = 'value2';
define('NS1::ns2::const1','value');
$dc = get_defined_constants(true);
print '<pre>'.print_r($dc['user'],true).'</pre>';
?>
gives
Array
(
[ns1::ns2::const2] => value2
[NS1::ns2::const1] => value
)
------------------------------------------------------------------------
[2008-10-15 15:36:32] kenashkov at gmail dot com
changed summary
------------------------------------------------------------------------
[2008-10-15 15:33:34] kenashkov at gmail dot com
I had a quick look again over the docs and nowhere is documented that
the namespaces are case insensitive. I think this should go in the docs,
as well if this issue with define() wont be fixed, to be documented too.
------------------------------------------------------------------------
[2008-10-15 15:29:42] kenashkov at gmail dot com
Description:
------------
The current implementatino of namespaces is case INSENSITIVE. But
defining a constant using define and having capitals in the namespace
makes the defined constant unreachable.
We can verify this using get_defined_constants(). In case a constant
was defined like:
<?
namespace NS1::ns2;
const const1;
?>
we can see the the defined constant/namespace is in fact:
ns1::ns2::const1;
But if the constant was defined using define(), it is kept with the
capitalization:
<?
define('NS1::ns2::const1','value');
?>
get_defined_constants() gives NS1::ns2::const1.
But because the namespaces are case insensitive the call:
<?
print NS1::ns2::const1;
?>
resolves in fact to ns1::ns2::const1 which is undefined.
Reproduce code:
---------------
<?
define('NS1::ns2::const1','value');
print NS1::ns2::const1;//error
//print ns1::ns2::const1;//would give error too
?>
Expected result:
----------------
value
Actual result:
--------------
Fatal error: Class 'NS1::ns2' not found in /home/local/tests/t35.php on
line 3
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=46304&edit=1