<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Name resolution rules</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.namespaces.fallback.html">Using namespaces: fallback to global function/constant</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.namespaces.faq.html">FAQ: things you need to know about namespaces</a></div> <div class="up"><a href="language.namespaces.html">Namespaces</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="language.namespaces.rules" class="sect1"> <h2 class="title">Name resolution rules</h2> <p class="verinfo">(PHP 5 >= 5.3.0)</p> <p class="para"> For the purposes of these resolution rules, here are some important definitions: <dl> <strong class="title">Namespace name definitions</strong> <dt> <span class="term">Unqualified name</span> <dd> <p class="para"> This is an identifier without a namespace separator, such as <em>Foo</em> </p> </dd> </dt> <dt> <span class="term">Qualified name</span> <dd> <p class="para"> This is an identifier with a namespace separator, such as <em>Foo\Bar</em> </p> </dd> </dt> <dt> <span class="term">Fully qualified name</span> <dd> <p class="para"> This is an identifier with a namespace separator that begins with a namespace separator, such as <em>\Foo\Bar</em>. The namespace <em>\Foo</em> is also a fully qualified name. </p> </dd> </dt> </dl> </p> <p class="para"> Names are resolved following these resolution rules: <ol type="1"> <li class="listitem"> <span class="simpara"> Calls to fully qualified functions, classes or constants are resolved at compile-time. For instance <em>new \A\B</em> resolves to class <em>A\B</em>. </span> </li> <li class="listitem"> <span class="simpara"> All unqualified and qualified names (not fully qualified names) are translated during compilation according to current import rules. For example, if the namespace <em>A\B\C</em> is imported as <em>C</em>, a call to <em>C\D\e()</em> is translated to <em>A\B\C\D\e()</em>. </span> </li> <li class="listitem"> <span class="simpara"> Inside a namespace, all qualified names not translated according to import rules have the current namespace prepended. For example, if a call to <em>C\D\e()</em> is performed within namespace <em>A\B</em>, it is translated to <em>A\B\C\D\e()</em>. </span> </li> <li class="listitem"> <span class="simpara"> Unqualified class names are translated during compilation according to current import rules (full name substituted for short imported name). In example, if the namespace <em>A\B\C</em> is imported as C, <em>new C()</em> is translated to <em>new A\B\C()</em>. </span> </li> <li class="listitem"> <span class="simpara"> Inside namespace (say A\B), calls to unqualified functions are resolved at run-time. Here is how a call to function <em>foo()</em> is resolved: </span> <ol type="1"> <li class="listitem"> <span class="simpara"> It looks for a function from the current namespace: <em>A\B\foo()</em>. </span> </li> <li class="listitem"> <span class="simpara"> It tries to find and call the <em class="emphasis">global</em> function <em>foo()</em>. </span> </li> </ol> </li> <li class="listitem"> <span class="simpara"> Inside namespace (say <em>A\B</em>), calls to unqualified or qualified class names (not fully qualified class names) are resolved at run-time. Here is how a call to <em>new C()</em> or <em>new D\E()</em> is resolved. For <em> new C()</em>: </span> <ol type="1"> <li class="listitem"> <span class="simpara"> It looks for a class from the current namespace: <em>A\B\C</em>. </span> </li> <li class="listitem"> <span class="simpara"> It attempts to autoload <em>A\B\C</em>. </span> </li> </ol> <span class="simpara"> For <em> new D\E()</em>: </span> <ol type="1"> <li class="listitem"> <span class="simpara"> It looks for a class by prepending the current namespace: <em>A\B\D\E</em>. </span> </li> <li class="listitem"> <span class="simpara"> It attempts to autoload <em>A\B\D\E</em>. </span> </li> </ol> <span class="simpara"> To reference any global class in the global namespace, its fully qualified name <em>new \C()</em> must be used. </span> </li> </ol> </p> <div class="example" id="example-257"> <p><strong>Example #1 Name resolutions illustrated</strong></p> <div class="example-contents"> <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">A</span><span style="color: #007700">;<br />use </span><span style="color: #0000BB">B</span><span style="color: #007700">\</span><span style="color: #0000BB">D</span><span style="color: #007700">, </span><span style="color: #0000BB">C</span><span style="color: #007700">\</span><span style="color: #0000BB">E </span><span style="color: #007700">as </span><span style="color: #0000BB">F</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// function calls<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// first tries to call "foo" defined in namespace "A"<br /> // then calls global function "foo"<br /><br /></span><span style="color: #007700">\</span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls function "foo" defined in global scope<br /><br /></span><span style="color: #0000BB">my</span><span style="color: #007700">\</span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls function "foo" defined in namespace "A\my"<br /><br /></span><span style="color: #0000BB">F</span><span style="color: #007700">(); </span><span style="color: #FF8000">// first tries to call "F" defined in namespace "A"<br /> // then calls global function "F"<br /><br />// class references<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">B</span><span style="color: #007700">(); </span><span style="color: #FF8000">// creates object of class "B" defined in namespace "A"<br /> // if not found, it tries to autoload class "A\B"<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">D</span><span style="color: #007700">(); </span><span style="color: #FF8000">// using import rules, creates object of class "D" defined in namespace "B"<br /> // if not found, it tries to autoload class "B\D"<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">F</span><span style="color: #007700">(); </span><span style="color: #FF8000">// using import rules, creates object of class "E" defined in namespace "C"<br /> // if not found, it tries to autoload class "C\E"<br /><br /></span><span style="color: #007700">new \</span><span style="color: #0000BB">B</span><span style="color: #007700">(); </span><span style="color: #FF8000">// creates object of class "B" defined in global scope<br /> // if not found, it tries to autoload class "B"<br /><br /></span><span style="color: #007700">new \</span><span style="color: #0000BB">D</span><span style="color: #007700">(); </span><span style="color: #FF8000">// creates object of class "D" defined in global scope<br /> // if not found, it tries to autoload class "D"<br /><br /></span><span style="color: #007700">new \</span><span style="color: #0000BB">F</span><span style="color: #007700">(); </span><span style="color: #FF8000">// creates object of class "F" defined in global scope<br /> // if not found, it tries to autoload class "F"<br /><br />// static methods/namespace functions from another namespace<br /><br /></span><span style="color: #0000BB">B</span><span style="color: #007700">\</span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls function "foo" from namespace "A\B"<br /><br /></span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls method "foo" of class "B" defined in namespace "A"<br /> // if class "A\B" not found, it tries to autoload class "A\B"<br /><br /></span><span style="color: #0000BB">D</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// using import rules, calls method "foo" of class "D" defined in namespace "B"<br /> // if class "B\D" not found, it tries to autoload class "B\D"<br /><br /></span><span style="color: #007700">\</span><span style="color: #0000BB">B</span><span style="color: #007700">\</span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls function "foo" from namespace "B"<br /><br /></span><span style="color: #007700">\</span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls method "foo" of class "B" from global scope<br /> // if class "B" not found, it tries to autoload class "B"<br /><br />// static methods/namespace functions of current namespace<br /><br /></span><span style="color: #0000BB">A</span><span style="color: #007700">\</span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls method "foo" of class "B" from namespace "A\A"<br /> // if class "A\A\B" not found, it tries to autoload class "A\A\B"<br /><br /></span><span style="color: #007700">\</span><span style="color: #0000BB">A</span><span style="color: #007700">\</span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// calls method "foo" of class "B" from namespace "A"<br /> // if class "A\B" not found, it tries to autoload class "A\B"<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> </div><hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.namespaces.fallback.html">Using namespaces: fallback to global function/constant</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.namespaces.faq.html">FAQ: things you need to know about namespaces</a></div> <div class="up"><a href="language.namespaces.html">Namespaces</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>