Source of: /manual/en/language.namespaces.faq.php
<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.namespaces.inc";
$setup = array (
'home' =>
array (
0 => 'index.php',
1 => 'PHP Manual',
),
'head' =>
array (
0 => 'UTF-8',
1 => 'en',
),
'this' =>
array (
0 => 'language.namespaces.faq.php',
1 => 'FAQ: things you need to know about namespaces',
),
'up' =>
array (
0 => 'language.namespaces.php',
1 => 'Namespaces',
),
'prev' =>
array (
0 => 'language.namespaces.rules.php',
1 => 'Name resolution rules',
),
'next' =>
array (
0 => 'language.exceptions.php',
1 => 'Exceptions',
),
);
$setup["toc"] = $TOC;
$setup["parents"] = $PARENTS;
manual_setup($setup);
manual_header();
?>
<div id="language.namespaces.faq" class="sect1">
<h2 class="title">FAQ: things you need to know about namespaces</h2>
<p class="para">
This FAQ is split into two sections: common questions, and some specifics of
implementation that are helpful to understand fully.
</p>
<p class="para">
First, the common questions.
</p><ol type="1">
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.shouldicare" class="link">If I don't use namespaces, should
I care about any of this?</a>
</span>
</li>
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.globalclass" class="link">How do I use internal or global
classes in a namespace?</a>
</span>
</li>
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.innamespace" class="link">How do I use namespaces classes
functions, or constants in their own namespace?</a>
</span>
</li>
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.full" class="link">
How does a name like <i>\my\name</i> or <i>\name</i>
resolve?
</a>
</span>
</li>
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.qualified" class="link">How does a name like
<i>my\name</i> resolve?</a>
</span>
</li>
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.shortname1" class="link">How does an unqualified class name
like <i>name</i> resolve?</a>
</span>
</li>
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.shortname2" class="link">How does an unqualified function
name or unqualified constant name
like <i>name</i> resolve?</a>
</span>
</li>
</ol><p>
</p>
<p class="para">
There are a few implementation details of the namespace implementations
that are helpful to understand.
</p><ol type="1">
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.conflict" class="link">Import names cannot conflict with
classes defined in the same file.</a>
</span>
</li>
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.nested" class="link">Nested namespaces are not allowed.
</a>
</span>
</li>
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.nofuncconstantuse" class="link">Neither functions nor
constants can be imported via the <i>use</i>
statement.</a>
</span>
</li>
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.quote" class="link">Dynamic namespace names (quoted
identifiers) should escape backslash.</a>
</span>
</li>
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.constants" class="link">Undefined Constants referenced
using any backslash die with fatal error</a>
</span>
</li>
<li class="listitem">
<span class="simpara">
<a href="language.namespaces.faq.php#language.namespaces.faq.builtinconst" class="link">Cannot override special
constants NULL, TRUE, FALSE, ZEND_THREAD_SAFE or ZEND_DEBUG_BUILD</a>
</span>
</li>
</ol><p>
</p>
<div id="language.namespaces.faq.shouldicare" class="sect2">
<h3 class="title">If I don't use namespaces, should I care about any of this?</h3>
<p class="para">
No. Namespaces do not affect any existing code in any way, or any
as-yet-to-be-written code that does not contain namespaces. You can
write this code if you wish:
</p>
<p class="para">
</p><div class="example">
<p><b>Example #1 Accessing global classes outside a namespace</b></p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br />$a </span><span style="color: #007700">= new \</span><span style="color: #0000BB">stdClass</span><span style="color: #007700">;</span>
</span>
</code></div>
</div>
</div><p>
</p>
<p class="para">
This is functionally equivalent to:
</p>
<p class="para">
</p><div class="example">
<p><b>Example #2 Accessing global classes outside a namespace</b></p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br />$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">;</span>
</span>
</code></div>
</div>
</div><p>
</p>
</div>
<div id="language.namespaces.faq.globalclass" class="sect2">
<h3 class="title">How do I use internal or global classes in a namespace?</h3>
<p class="para">
</p><div class="example">
<p><b>Example #3 Accessing internal classes in namespaces</b></p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">foo</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new \</span><span style="color: #0000BB">stdClass</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">test</span><span style="color: #007700">(\</span><span style="color: #0000BB">ArrayObject $typehintexample </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">) {}<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= \</span><span style="color: #0000BB">DirectoryIterator</span><span style="color: #007700">::</span><span style="color: #0000BB">CURRENT_AS_FILEINFO</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// extending an internal or global class<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyException </span><span style="color: #007700">extends \</span><span style="color: #0000BB">Exception </span><span style="color: #007700">{}<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
</p>
</div>
<div id="language.namespaces.faq.innamespace" class="sect2">
<h3 class="title">
How do I use namespaces classes, functions, or constants in their own
namespace?
</h3>
<p class="para">
</p><div class="example">
<p><b>Example #4 Accessing internal classes, functions or constants in namespaces</b></p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">foo</span><span style="color: #007700">;<br /><br />class </span><span style="color: #0000BB">MyClass </span><span style="color: #007700">{}<br /><br /></span><span style="color: #FF8000">// using a class from the current namespace as a type hint<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">MyClass $typehintexample </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">) {}<br /></span><span style="color: #FF8000">// another way to use a class from the current namespace as a type hint<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(\</span><span style="color: #0000BB">foo</span><span style="color: #007700">\</span><span style="color: #0000BB">MyClass $typehintexample </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">) {}<br /><br /></span><span style="color: #FF8000">// extending a class from the current namespace<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Extended </span><span style="color: #007700">extends </span><span style="color: #0000BB">MyClass </span><span style="color: #007700">{}<br /><br /></span><span style="color: #FF8000">// accessing a global function<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= \</span><span style="color: #0000BB">globalfunc</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// accessing a global constant<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= \</span><span style="color: #0000BB">INI_ALL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
</p>
</div>
<div id="language.namespaces.faq.full" class="sect2">
<h3 class="title">
How does a name like <i>\my\name</i> or <i>\name</i>
resolve?
</h3>
<p class="para">
Names that begin with a <i>\</i> always resolve to what they
look like, so <i>\my\name</i> is in fact <i>my\name</i>,
and <i>\Exception</i> is <i>Exception</i>.
</p><div class="example">
<p><b>Example #5 Fully Qualified names</b></p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">foo</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new \</span><span style="color: #0000BB">my</span><span style="color: #007700">\</span><span style="color: #0000BB">name</span><span style="color: #007700">(); </span><span style="color: #FF8000">// instantiates "my\name" class<br /></span><span style="color: #007700">echo \</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #DD0000">'hi'</span><span style="color: #007700">); </span><span style="color: #FF8000">// calls function "strlen"<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= \</span><span style="color: #0000BB">INI_ALL</span><span style="color: #007700">; </span><span style="color: #FF8000">// $a is set to the value of constant "INI_ALL"<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
</p>
</div>
<div id="language.namespaces.faq.qualified" class="sect2">
<h3 class="title">How does a name like <i>my\name</i> resolve?</h3>
<p class="para">
Names that contain a backslash but do not begin with a backslash like
<i>my\name</i> can be resolved in 2 different ways.
</p>
<p class="para">
If there is
an import statement that aliases another name to <i>my</i>, then
the import alias is applied to the <i>my</i> in <i>my\name</i>.
</p>
<p class="para">
Otherwise, the current namespace name is prepended to <i>my\name</i>.
</p>
<p class="para">
</p><div class="example">
<p><b>Example #6 Qualified names</b></p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">foo</span><span style="color: #007700">;<br />use </span><span style="color: #0000BB">blah</span><span style="color: #007700">\</span><span style="color: #0000BB">blah </span><span style="color: #007700">as </span><span style="color: #0000BB">foo</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">my</span><span style="color: #007700">\</span><span style="color: #0000BB">name</span><span style="color: #007700">(); </span><span style="color: #FF8000">// instantiates "foo\my\name" class<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">\</span><span style="color: #0000BB">bar</span><span style="color: #007700">::</span><span style="color: #0000BB">name</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls static method "name" in class "blah\blah\bar"<br /></span><span style="color: #0000BB">my</span><span style="color: #007700">\</span><span style="color: #0000BB">bar</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls function "foo\my\bar"<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">my</span><span style="color: #007700">\</span><span style="color: #0000BB">BAR</span><span style="color: #007700">; </span><span style="color: #FF8000">// sets $a to the value of constant "foo\my\BAR"<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
</p>
</div>
<div id="language.namespaces.faq.shortname1" class="sect2">
<h3 class="title">How does an unqualified class name like <i>name</i> resolve?</h3>
<p class="para">
Class names that do not contain a backslash like
<i>name</i> can be resolved in 2 different ways.
</p>
<p class="para">
If there is
an import statement that aliases another name to <i>name</i>, then
the import alias is applied.
</p>
<p class="para">
Otherwise, the current namespace name is prepended to <i>name</i>.
</p>
<p class="para">
</p><div class="example">
<p><b>Example #7 Unqualified class names</b></p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">foo</span><span style="color: #007700">;<br />use </span><span style="color: #0000BB">blah</span><span style="color: #007700">\</span><span style="color: #0000BB">blah </span><span style="color: #007700">as </span><span style="color: #0000BB">foo</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">name</span><span style="color: #007700">(); </span><span style="color: #FF8000">// instantiates "foo\name" class<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">::</span><span style="color: #0000BB">name</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls static method "name" in class "blah\blah"<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
</p>
</div>
<div id="language.namespaces.faq.shortname2" class="sect2">
<h3 class="title">
How does an unqualified function name or unqualified constant name
like <i>name</i> resolve?
</h3>
<p class="para">
Function or constant names that do not contain a backslash like
<i>name</i> can be resolved in 2 different ways.
</p>
<p class="para">
First, the current namespace name is prepended to <i>name</i>.
</p>
<p class="para">
Finally, if the constant or function <i>name</i> does not exist
in the current namespace, a global constant or function <i>name</i>
is used if it exists.
</p>
<p class="para">
</p><div class="example">
<p><b>Example #8 Unqualified function or constant names</b></p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">foo</span><span style="color: #007700">;<br />use </span><span style="color: #0000BB">blah</span><span style="color: #007700">\</span><span style="color: #0000BB">blah </span><span style="color: #007700">as </span><span style="color: #0000BB">foo</span><span style="color: #007700">;<br /><br />const </span><span style="color: #0000BB">FOO </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">my</span><span style="color: #007700">() {}<br />function </span><span style="color: #0000BB">foo</span><span style="color: #007700">() {}<br />function </span><span style="color: #0000BB">sort</span><span style="color: #007700">(&</span><span style="color: #0000BB">$a</span><span style="color: #007700">)<br />{<br /> </span><span style="color: #0000BB">sort</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">array_flip</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /> return </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">my</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls "foo\my"<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #DD0000">'hi'</span><span style="color: #007700">); </span><span style="color: #FF8000">// calls global function "strlen" because "foo\strlen" does not exist<br /></span><span style="color: #0000BB">$arr </span><span style="color: #007700">= array(</span><span style="color: #0000BB">1</span><span style="color: #007700">,</span><span style="color: #0000BB">3</span><span style="color: #007700">,</span><span style="color: #0000BB">2</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">sort</span><span style="color: #007700">(</span><span style="color: #0000BB">$arr</span><span style="color: #007700">); </span><span style="color: #FF8000">// calls function "foo\sort"<br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls function "foo\foo" - import is not applied<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">FOO</span><span style="color: #007700">; </span><span style="color: #FF8000">// sets $a to value of constant "foo\FOO" - import is not applied<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">INI_ALL</span><span style="color: #007700">; </span><span style="color: #FF8000">// sets $b to value of global constant "INI_ALL"<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
</p>
</div>
<div id="language.namespaces.faq.conflict" class="sect2">
<h3 class="title">Import names cannot conflict with classes defined in the same file.</h3>
<p class="para">
The following script combinations are legal:
</p><div class="informalexample">
<p class="simpara">file1.php</p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">my</span><span style="color: #007700">\</span><span style="color: #0000BB">stuff</span><span style="color: #007700">;<br />class </span><span style="color: #0000BB">MyClass </span><span style="color: #007700">{}<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
<p class="simpara">another.php</p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">another</span><span style="color: #007700">;<br />class </span><span style="color: #0000BB">thing </span><span style="color: #007700">{}<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
<p class="simpara">file2.php</p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">my</span><span style="color: #007700">\</span><span style="color: #0000BB">stuff</span><span style="color: #007700">;<br />include </span><span style="color: #DD0000">'file1.php'</span><span style="color: #007700">;<br />include </span><span style="color: #DD0000">'another.php'</span><span style="color: #007700">;<br /><br />use </span><span style="color: #0000BB">another</span><span style="color: #007700">\</span><span style="color: #0000BB">thing </span><span style="color: #007700">as </span><span style="color: #0000BB">MyClass</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass</span><span style="color: #007700">; </span><span style="color: #FF8000">// instantiates class "thing" from namespace another<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
</p>
<p class="para">
There is no name conflict, even though the class <i>MyClass</i> exists
within the <i>my\stuff</i> namespace, because the MyClass definition is
in a separate file. However, the next example causes a fatal error on name conflict
because MyClass is defined in the same file as the use statement.
</p><div class="informalexample">
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">my</span><span style="color: #007700">\</span><span style="color: #0000BB">stuff</span><span style="color: #007700">;<br />use </span><span style="color: #0000BB">another</span><span style="color: #007700">\</span><span style="color: #0000BB">thing </span><span style="color: #007700">as </span><span style="color: #0000BB">MyClass</span><span style="color: #007700">;<br />class </span><span style="color: #0000BB">MyClass </span><span style="color: #007700">{} </span><span style="color: #FF8000">// fatal error: MyClass conflicts with import statement<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
</p>
</div>
<div id="language.namespaces.faq.nested" class="sect2">
<h3 class="title">Nested namespaces are not allowed.</h3>
<p class="para">
PHP does not allow nesting namespaces
</p><div class="informalexample">
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">my</span><span style="color: #007700">\</span><span style="color: #0000BB">stuff </span><span style="color: #007700">{<br /> namespace </span><span style="color: #0000BB">nested </span><span style="color: #007700">{<br /> class </span><span style="color: #0000BB">foo </span><span style="color: #007700">{}<br /> }<br />}<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
However, it is easy to simulate nested namespaces like so:
</p><div class="informalexample">
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">my</span><span style="color: #007700">\</span><span style="color: #0000BB">stuff</span><span style="color: #007700">\</span><span style="color: #0000BB">nested </span><span style="color: #007700">{<br /> class </span><span style="color: #0000BB">foo </span><span style="color: #007700">{}<br />}<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
</p>
</div>
<div id="language.namespaces.faq.nofuncconstantuse" class="sect2">
<h3 class="title">Neither functions nor constants can be imported via the <i>use</i>
statement.</h3>
<p class="para">
The only elements that are affected by <i>use</i> statements are namespaces
and class names. In order to shorten a long constant or function, import its containing
namespace
</p><div class="informalexample">
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">mine</span><span style="color: #007700">;<br />use </span><span style="color: #0000BB">ultra</span><span style="color: #007700">\</span><span style="color: #0000BB">long</span><span style="color: #007700">\</span><span style="color: #0000BB">ns</span><span style="color: #007700">\</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">name</span><span style="color: #007700">\</span><span style="color: #0000BB">CONSTANT</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">name</span><span style="color: #007700">\</span><span style="color: #0000BB">func</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
</p>
</div>
<div id="language.namespaces.faq.quote" class="sect2">
<h3 class="title">Dynamic namespace names (quoted identifiers) should escape backslash</h3>
<p class="para">
It is very important to realize that because the backslash is used as an escape character
within strings, it should always be doubled when used inside a string. Otherwise
there is a risk of unintended consequences:
</p><div class="example">
<p><b>Example #9 Dangers of using namespaced names inside a double-quoted string</b></p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br />$a </span><span style="color: #007700">= new </span><span style="color: #DD0000">"dangerous\name"</span><span style="color: #007700">; </span><span style="color: #FF8000">// \n is a newline inside double quoted strings!<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #DD0000">'not\at\all\dangerous'</span><span style="color: #007700">; </span><span style="color: #FF8000">// no problems here.<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
Inside a single-quoted string, the backslash escape sequence is much safer to use, but it
is still recommended practice to escape backslashes in all strings as a best practice.
</p>
</div>
<div id="language.namespaces.faq.constants" class="sect2">
<h3 class="title">Undefined Constants referenced using any backslash die with fatal error</h3>
<p class="para">
Any undefined constant that is unqualified like <i>FOO</i> will
produce a notice explaining that PHP assumed <i>FOO</i> was the value
of the constant. Any constant, qualified or fully qualified, that contains a
backslash will produce a fatal error if not found.
</p><div class="example">
<p><b>Example #10 Undefined constants</b></p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">bar</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">FOO</span><span style="color: #007700">; </span><span style="color: #FF8000">// produces notice - undefined constants "FOO" assumed "FOO";<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= \</span><span style="color: #0000BB">FOO</span><span style="color: #007700">; </span><span style="color: #FF8000">// fatal error, undefined namespace constant FOO<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">Bar</span><span style="color: #007700">\</span><span style="color: #0000BB">FOO</span><span style="color: #007700">; </span><span style="color: #FF8000">// fatal error, undefined namespace constant bar\Bar\FOO<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= \</span><span style="color: #0000BB">Bar</span><span style="color: #007700">\</span><span style="color: #0000BB">FOO</span><span style="color: #007700">; </span><span style="color: #FF8000">// fatal error, undefined namespace constant Bar\FOO<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
</p>
</div>
<div id="language.namespaces.faq.builtinconst" class="sect2">
<h3 class="title">Cannot override special constants NULL, TRUE, FALSE, ZEND_THREAD_SAFE or ZEND_DEBUG_BUILD</h3>
<p class="para">
Any attempt to define a namespaced constant that is a special, built-in constant
results in a fatal error
</p><div class="example">
<p><b>Example #11 Undefined constants</b></p>
<div class="example-contents programlisting">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">bar</span><span style="color: #007700">;<br />const </span><span style="color: #0000BB">NULL </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">; </span><span style="color: #FF8000">// fatal error;<br /></span><span style="color: #007700">const </span><span style="color: #0000BB">true </span><span style="color: #007700">= </span><span style="color: #DD0000">'stupid'</span><span style="color: #007700">; </span><span style="color: #FF8000">// also fatal error;<br />// etc.<br /></span><span style="color: #0000BB">?></span>
</span>
</code></div>
</div>
</div><p>
</p>
</div>
</div><?php manual_footer(); ?>