<?xml version="1.0" encoding="UTF-8"?>
<!-- $Revision$ -->
<chapter xml:id="language.namespaces" xmlns="http://docbook.org/ns/docbook"
 version="1.1">
 <title>Namespaces</title>

 <sect1 xml:id="language.namespaces.rationale">
  <title>Namespaces overview</title>
  <simpara>
   What are namespaces? In the broadest definition namespaces are a way of encapsulating
   items.  This can be seen as an abstract concept in many places. For example, in any
   operating system directories serve to group related files, and act as a namespace for
   the files within them. As a concrete example, the file <literal>foo.txt</literal> can
   exist in both directory <literal>/home/greg</literal> and in <literal>/home/other</literal>,
   but two copies of <literal>foo.txt</literal> cannot co-exist in the same directory. In
   addition, to access the <literal>foo.txt</literal> file outside of the
   <literal>/home/greg</literal> directory, we must prepend the directory name to the file
   name using the directory separator to get <literal>/home/greg/foo.txt</literal>. This
   same principle extends to namespaces in the programming world.
  </simpara>
  <simpara>
   In the PHP world, namespaces are designed to solve two problems that authors
   of libraries and applications encounter when creating re-usable code elements
   such as classes or functions:
  </simpara>
  <para>
   <orderedlist>
    <listitem>
     <simpara>
      Name collisions between code you create, and
      internal PHP classes/functions/constants or third-party classes/functions/constants.
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      Ability to alias (or shorten) Extra_Long_Names designed to alleviate the first problem,
      improving readability of source code.
     </simpara>
    </listitem>
   </orderedlist>
  </para>
  <simpara>
   PHP Namespaces provide a way in which to group related classes,
   functions and constants.  Here is an example of namespace syntax in PHP:
  </simpara>
  <example>
   <title>Namespace syntax example</title>
   <programlisting role="php">
   <![CDATA[
<?php
namespace my\name; // see "Defining Namespaces" section

class MyClass {}
function myfunction() {}
const MYCONST = 1;

$a = new MyClass;
$c = new \my\name\MyClass; // see "Global Space" section

$a = strlen('hi'); // see "Using namespaces: fallback to global
                   // function/constant" section

$d = namespace\MYCONST; // see "namespace operator and __NAMESPACE__
                        // constant" section
$d = __NAMESPACE__ . '\MYCONST';
echo constant($d); // see "Namespaces and dynamic language features" section
?>
    ]]>
   </programlisting>
  </example>
  <simpara>
   Namespaces are available in PHP as of PHP 5.3.0.
  </simpara>
 </sect1>

 <sect1 xml:id="language.namespaces.definition">
  <title>Defining namespaces</title>
  <para>
   Although any valid PHP code can be contained within a namespace, only three
   type of code are affected by namespaces: classes, functions and constants.
  </para>
  <para>
   Namespaces are declared using the <literal>namespace</literal>
   keyword.  A file containing a namespace must declare the namespace
   at the top of the file before any other code - with one exception: the
   <xref linkend="control-structures.declare" /> keyword.
   <example>
    <title>Declaring a single namespace</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

?>
]]>
    </programlisting>
   </example>
   The only code construct allowed before a namespace declaration is the
   <literal>declare</literal> statement, for defining encoding of a source file.  In addition,
   no non-PHP code may precede a namespace declaration, including extra whitespace:
   <example>
    <title>Declaring a single namespace</title>
    <programlisting role="php">
     <![CDATA[
<html>
<?php
namespace MyProject; // fatal error - namespace must be the first statement in the script
?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   In addition, unlike any other PHP construct, the same namespace may be defined
   in multiple files, allowing splitting up of a namespace's contents across the filesystem.
  </para>
 </sect1>
 <sect1 xml:id="language.namespaces.nested">
  <title>Declaring sub-namespaces</title>
  <para>
   Much like directories and files, PHP namespaces also contain the ability to specify
   a hierarchy of namespace names.  Thus, a namespace name can be defined with
   sub-levels:
   <example>
    <title>Declaring a single namespace with hierarchy</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace MyProject\Sub\Level;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

?>
]]>
    </programlisting>
   </example>
   The above example creates constant <literal>MyProject\Sub\Level\CONNECT_OK</literal>,
   class <literal>MyProject\Sub\Level\Connection</literal> and function
   <literal>MyProject\Sub\Level\connect</literal>.
  </para>
 </sect1>
 <sect1 xml:id="language.namespaces.definitionmultiple">
  <title>Defining multiple namespaces in the same file</title>
  <para>
   Multiple namespaces may also be declared in the same file.  There are two allowed
   syntaxes.
  </para>
  <para>
   <example>
    <title>Declaring multiple namespaces, simple combination syntax</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

namespace AnotherProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   This syntax is not recommended for combining namespaces into a single file.
   Instead it is recommended to use the alternate bracketed syntax.
  </para>
  <para>
   <example>
    <title>Declaring multiple namespaces, bracketed syntax</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace AnotherProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}
?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   It is strongly discouraged as a coding practice to combine multiple namespaces into
   the same file.  The primary use case is to combine multiple PHP scripts into the same
   file.
  </para>
  <para>
   To combine global non-namespaced code with namespaced code, only bracketed syntax is
   supported.  Global code should be
   encased in a namespace statement with no namespace name as in:
   <example>
    <title>Declaring multiple namespaces and unnamespaced code</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace { // global code
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   No PHP code may exist outside of the namespace brackets except for an opening
   declare statement.
   <example>
    <title>Declaring multiple namespaces and unnamespaced code</title>
    <programlisting role="php">
     <![CDATA[
<?php
declare(encoding='UTF-8');
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace { // global code
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
]]>
    </programlisting>
   </example>
  </para>
 </sect1>
 <sect1 xml:id="language.namespaces.basics">
  <title>Using namespaces: Basics</title>
  <para>
   Before discussing the use of namespaces, it is important to understand how PHP
   knows which namespaced element your code is requesting.  A simple analogy can be made
   between PHP namespaces and a filesystem.  There are three ways to access a file in a
   file system:
   <orderedlist>
    <listitem>
     <simpara>
      Relative file name like <literal>foo.txt</literal>.  This resolves to
      <literal>currentdirectory/foo.txt</literal> where currentdirectory is the
      directory currently occupied.  So if the current directory is
      <literal>/home/foo</literal>, the name resolves to <literal>/home/foo/foo.txt</literal>.
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      Relative path name like <literal>subdirectory/foo.txt</literal>.  This resolves
      to <literal>currentdirectory/subdirectory/foo.txt</literal>.
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      Absolute path name like <literal>/main/foo.txt</literal>.  This resolves
      to <literal>/main/foo.txt</literal>.
     </simpara>
    </listitem>
   </orderedlist>
   The same principle can be applied to namespaced elements in PHP.  For
   example, a class name can be referred to in three ways:
   <orderedlist>
    <listitem>
     <simpara>
      Unqualified name, or an unprefixed class name like
      <literal>$a = new foo();</literal> or
      <literal>foo::staticmethod();</literal>.  If the current namespace is
      <literal>currentnamespace</literal>, this resolves to
      <literal>currentnamespace\foo</literal>.  If
      the code is global, non-namespaced code, this resolves to <literal>foo</literal>.
     </simpara>
     <simpara>
      One caveat: unqualified names for functions and constants will
      resolve to global functions and constants if the namespaced function or constant
      is not defined.  See <link linkend="language.namespaces.fallback">Using namespaces:
      fallback to global function/constant</link> for details.
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      Qualified name, or a prefixed class name like
      <literal>$a = new subnamespace\foo();</literal> or
      <literal>subnamespace\foo::staticmethod();</literal>.  If the current namespace is
      <literal>currentnamespace</literal>, this resolves to
      <literal>currentnamespace\subnamespace\foo</literal>.  If
      the code is global, non-namespaced code, this resolves to <literal>subnamespace\foo</literal>.
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      Fully qualified name, or a prefixed name with global prefix operator like
      <literal>$a = new \currentnamespace\foo();</literal> or
      <literal>\currentnamespace\foo::staticmethod();</literal>.  This always resolves
      to the literal name specified in the code, <literal>currentnamespace\foo</literal>.
     </simpara>
    </listitem>
   </orderedlist>
  </para>
  <para>
   Here is an example of the three kinds of syntax in actual code:
   <informalexample>
    <simpara>file1.php</simpara>
    <programlisting role="php">
     <![CDATA[
<?php
namespace Foo\Bar\subnamespace;

const FOO = 1;
function foo() {}
class foo
{
    static function staticmethod() {}
}
?>
     ]]>
    </programlisting>
    <simpara>file2.php</simpara>
    <programlisting role="php">
     <![CDATA[
<?php
namespace Foo\Bar;
include 'file1.php';

const FOO = 2;
function foo() {}
class foo
{
    static function staticmethod() {}
}

/* Unqualified name */
foo(); // resolves to function Foo\Bar\foo
foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO

/* Qualified name */
subnamespace\foo(); // resolves to function Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // resolves to class Foo\Bar\subnamespace\foo,
                                  // method staticmethod
echo subnamespace\FOO; // resolves to constant Foo\Bar\subnamespace\FOO
                                  
/* Fully qualified name */
\Foo\Bar\foo(); // resolves to function Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo \Foo\Bar\FOO; // resolves to constant Foo\Bar\FOO
?>
     ]]>
    </programlisting>
   </informalexample>
  </para>
  <para>
   Note that to access any global
   class, function or constant, a fully qualified name can be used, such as
   <function>\strlen</function> or <classname>\Exception</classname> or
   <literal>\INI_ALL</literal>.
   <example>
    <title>Accessing global classes, functions and constants from within a namespace</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace Foo;

function strlen() {}
const INI_ALL = 3;
class Exception {}

$a = \strlen('hi'); // calls global function strlen
$b = \INI_ALL; // accesses global constant INI_ALL
$c = new \Exception('error'); // instantiates global class Exception
?>
     ]]>
    </programlisting>
   </example>
  </para>
 </sect1>
 <sect1 xml:id="language.namespaces.dynamic">
  <title>Namespaces and dynamic language features</title>
  <para>
   PHP's implementation of namespaces is influenced by its dynamic nature as a programming
   language.  Thus, to convert code like the following example into namespaced code:
   <example>
    <title>Dynamically accessing elements</title>
    <simpara>example1.php:</simpara>
    <programlisting role="php">
     <![CDATA[
<?php
class classname
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\n";
}
const constname = "global";

$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
?>
    ]]>
    </programlisting>
   </example>
   One must use the fully qualified name (class name with namespace prefix).
   Note that because there is no difference between a qualified and a fully qualified Name
   inside a dynamic class name, function name, or constant name, the leading backslash is
   not necessary.
   <example>
    <title>Dynamically accessing namespaced elements</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace namespacename;
class classname
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\n";
}
const constname = "namespaced";

include 'example1.php';

$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global

/* note that if using double quotes, "\\namespacename\\classname" must be used */
$a = '\namespacename\classname';
$obj = new $a; // prints namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // also prints namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // prints namespacename\funcname
$b = '\namespacename\funcname';
$b(); // also prints namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // prints namespaced
echo constant('namespacename\constname'), "\n"; // also prints namespaced
?>
    ]]>
    </programlisting>
   </example>
  </para>
  <para>
   Be sure to read the <link linkend="language.namespaces.faq.quote">note about
   escaping namespace names in strings</link>.
  </para>
 </sect1>
 <sect1 xml:id="language.namespaces.nsconstants">
  <title>namespace keyword and __NAMESPACE__ constant</title>
  <para>
   PHP supports two ways of abstractly accessing elements within the current namespace,
   the <constant>__NAMESPACE__</constant> magic constant, and the <literal>namespace</literal>
   keyword.
  </para>
  <para>
   The value of <constant>__NAMESPACE__</constant> is a string that contains the current
   namespace name.  In global, un-namespaced code, it contains an empty string.
   <example>
    <title>__NAMESPACE__ example, namespaced code</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace MyProject;

echo '"', __NAMESPACE__, '"'; // outputs "MyProject"
?>
]]>
    </programlisting>
   </example>
   <example>
    <title>__NAMESPACE__ example, global code</title>
    <programlisting role="php">
     <![CDATA[
<?php

echo '"', __NAMESPACE__, '"'; // outputs ""
?>
]]>
    </programlisting>
   </example>
   The <constant>__NAMESPACE__</constant> constant is useful for dynamically constructing
   names, for instance:
   <example>
    <title>using __NAMESPACE__ for dynamic name construction</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace MyProject;

function get($classname)
{
    $a = __NAMESPACE__ . '\\' . $classname;
    return new $a;
}
?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   The <literal>namespace</literal> keyword can be used to explicitly request
   an element from the current namespace or a sub-namespace.  It is the namespace
   equivalent of the <literal>self</literal> operator for classes.
   <example>
    <title>the namespace operator, inside a namespace</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace MyProject;

use blah\blah as mine; // see "Using namespaces: importing/aliasing"

blah\mine(); // calls function MyProject\blah\mine()
namespace\blah\mine(); // calls function MyProject\blah\mine()

namespace\func(); // calls function MyProject\func()
namespace\sub\func(); // calls function MyProject\sub\func()
namespace\cname::method(); // calls static method "method" of class MyProject\cname
$a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname
$b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b
?>
]]>
    </programlisting>
   </example>
   <example>
    <title>the namespace operator, in global code</title>
    <programlisting role="php">
     <![CDATA[
<?php

namespace\func(); // calls function func()
namespace\sub\func(); // calls function sub\func()
namespace\cname::method(); // calls static method "method" of class cname
$a = new namespace\sub\cname(); // instantiates object of class sub\cname
$b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b
?>
]]>
    </programlisting>
   </example>
  </para>
 </sect1>
 <sect1 xml:id="language.namespaces.importing">
  <title>Using namespaces: Aliasing/Importing</title>
  <para>
   The ability to refer to an external fully qualified name with an alias, or importing,
   is an important feature of namespaces.  This is similar to the
   ability of unix-based filesystems to create symbolic links to a file or to a directory.
  </para>
  <para>
   PHP namespaces support
   two kinds of aliasing or importing: aliasing a class name, and aliasing a namespace name.
   Note that importing a function or constant is not supported.
  </para>
  <para>
   In PHP, aliasing is accomplished with the <literal>use</literal> operator.  Here
   is an example showing all 3 kinds of importing:
   <example>
    <title>importing/aliasing with the use operator</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace foo;
use My\Full\Classname as Another;

// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;

// importing a global class
use \ArrayObject;

$obj = new namespace\Another; // instantiates object of class foo\Another
$obj = new Another; // instantiates object of class My\Full\Classname
NSname\subns\func(); // calls function My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // instantiates object of class ArrayObject
// without the "use \ArrayObject" we would instantiate an object of class foo\ArrayObject
?>
]]>
    </programlisting>
   </example>
   Note that for namespaced names (fully qualified namespace names containing
   namespace separator, such as <literal>Foo\Bar</literal> as opposed to global names that
   do not, such as <literal>FooBar</literal>), the leading backslash is unnecessary and not
   allowed, as import names
   must be fully qualified, and are not processed relative to the current namespace.
  </para>
  <para>
   PHP additionally supports a convenience shortcut to place multiple use statements
   on the same line
   <example>
    <title>importing/aliasing with the use operator, multiple use statements combined</title>
    <programlisting role="php">
     <![CDATA[
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // instantiates object of class My\Full\Classname
NSname\subns\func(); // calls function My\Full\NSname\subns\func
?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   Importing is performed at compile-time, and so does not affect dynamic class, function
   or constant names.
   <example>
    <title>Importing and dynamic names</title>
    <programlisting role="php">
     <![CDATA[
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // instantiates object of class My\Full\Classname
$a = 'Another';
$obj = new $a;      // instantiates object of class Another
?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   In addition, importing only affects unqualified and qualified names.  Fully qualified
   names are absolute, and unaffected by imports.
   <example>
    <title>Importing and fully qualified names</title>
    <programlisting role="php">
     <![CDATA[
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // instantiates object of class My\Full\Classname
$obj = new \Another; // instantiates object of class Another
$obj = new Another\thing; // instantiates object of class My\Full\Classname\thing
$obj = new \Another\thing; // instantiates object of class Another\thing
?>
]]>
    </programlisting>
   </example>
  </para>
 </sect1>
 <sect1 xml:id="language.namespaces.global">
  <title>Global space</title>
  <para>
   Without any namespace definition, all class and function definitions are
   placed into the global space - as it was in PHP before namespaces were
   supported. Prefixing a name with <literal>\</literal> will specify that 
   the name is required from the global space even in the context of the 
   namespace.
   <example>
    <title>Using global space specification</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace A\B\C;

/* This function is A\B\C\fopen */
function fopen() { 
     /* ... */
     $f = \fopen(...); // call global fopen
     return $f;
} 
?>
    ]]>
    </programlisting>
   </example>
  </para>
 </sect1>
 <sect1 xml:id="language.namespaces.fallback">
  <title>Using namespaces: fallback to global function/constant</title>
  <para>
   Inside a namespace, when PHP encounters a unqualified Name in a class name, function or
   constant context, it resolves these with different priorities.  Class names always
   resolve to the current namespace name.  Thus to access internal or non-namespaced
   user classes, One must refer to them with their fully qualified Name as in:
   <example>
    <title>Accessing global classes inside a namespace</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace A\B\C;
class Exception extends \Exception {}

$a = new Exception('hi'); // $a is an object of class A\B\C\Exception
$b = new \Exception('hi'); // $b is an object of class Exception

$c = new ArrayObject; // fatal error, class A\B\C\ArrayObject not found
?>
    ]]>
    </programlisting>
   </example>
  </para>
  <para>
   For functions and constants, PHP will fall back to global functions or constants
   if a namespaced function or constant does not exist.
   <example>
    <title>global functions/constants fallback inside a namespace</title>
    <programlisting role="php">
     <![CDATA[
<?php
namespace A\B\C;

const E_ERROR = 45;
function strlen($str)
{
    return \strlen($str) - 1;
}

echo E_ERROR, "\n"; // prints "45"
echo INI_ALL, "\n"; // prints "7" - falls back to global INI_ALL

echo strlen('hi'), "\n"; // prints "1"
if (is_array('hi')) { // prints "is not array"
    echo "is array\n";
} else {
    echo "is not array\n";
}
?>
    ]]>
    </programlisting>
   </example>
  </para>
 </sect1>

 <sect1 xml:id="language.namespaces.rules">
  <title>Name resolution rules</title>
  <para>
   For the purposes of these resolution rules, here are some important definitions:
   <variablelist>
    <title>Namespace name definitions</title>
    <varlistentry>
     <term>Unqualified name</term>
     <listitem>
      <para>
       This is an identifier without a namespace separator, such as <literal>Foo</literal>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term>Qualified name</term>
     <listitem>
      <para>
       This is an identifier with a namespace separator, such as <literal>Foo\Bar</literal>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term>Fully qualified name</term>
     <listitem>
      <para>
       This is an identifier with a namespace separator that begins with a namespace
       separator, such as <literal>\Foo\Bar</literal>.  <literal>namespace\Foo</literal>
       is also a fully qualified name.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
  <para>
   Names are resolved following these resolution rules:
   <orderedlist>
    <listitem>
     <simpara>
      Calls to fully qualified functions, classes or constants are resolved at compile-time.
      For instance <literal>new \A\B</literal> resolves to class <literal>A\B</literal>.
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      All unqualified and qualified names (not fully qualified names) are translated during
      compilation according to current
      import rules. For example, if the namespace <literal>A\B\C</literal> is imported as
      <literal>C</literal>, a call to 
      <literal>C\D\e()</literal> is translated to <literal>A\B\C\D\e()</literal>.
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      Inside a namespace, all qualified names not translated according to import
      rules have the current namespace prepended.  For example, if a call
      to <literal>C\D\e()</literal> is performed within namespace <literal>A\B</literal>,
      it is translated to <literal>A\B\C\D\e()</literal>.
     </simpara>
    </listitem>
    <listitem>
     <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 <literal>A\B\C</literal> is imported as C, <literal>new C()</literal> is 
      translated to <literal>new A\B\C()</literal>.
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      Inside namespace (say A\B), calls to unqualified functions are resolved at run-time.
      Here is how a 
      call to function <literal>foo()</literal> is resolved:
     </simpara>
      <orderedlist>
       <listitem>
        <simpara>
         It looks for a function from the current namespace:
         <literal>A\B\foo()</literal>.
        </simpara>
       </listitem>
       <listitem>
        <simpara>
         It tries to find and call the <emphasis>global</emphasis> function
         <literal>foo()</literal>.
        </simpara>
       </listitem>
      </orderedlist>
    </listitem>
    <listitem>
     <simpara>
      Inside namespace (say <literal>A\B</literal>), calls to unqualified or qualified
      class names (not fully qualified class names)
      are resolved at run-time. Here is how a call to 
      <literal>new C()</literal> or <literal>new D\E()</literal> is resolved.
      For <literal> new C()</literal>:
     </simpara>
     <orderedlist>
      <listitem>
       <simpara>
        It looks for a class from the current namespace:
        <literal>A\B\C</literal>.
       </simpara>
      </listitem>
      <listitem>
       <simpara>
        It attempts to autoload <literal>A\B\C</literal>.
       </simpara>
      </listitem>
     </orderedlist>
     <simpara>
      For <literal> new D\E()</literal>:
     </simpara>
     <orderedlist>
      <listitem>
       <simpara>
        It looks for a class by prepending the current namespace:
        <literal>A\B\D\E</literal>.
       </simpara>
      </listitem>
      <listitem>
       <simpara>
        It attempts to autoload <literal>A\B\D\E</literal>.
       </simpara>
      </listitem>
     </orderedlist>
     <simpara>
      To reference any global class in the global namespace, 
      its fully qualified name <literal>new \C()</literal> must be used.
     </simpara>
    </listitem>
   </orderedlist>
  </para>
  <example>
   <title>Name resolutions illustrated</title>
   <programlisting role="php">
<![CDATA[
<?php
namespace A;
use B\D, C\E as F;

// function calls

foo();      // first tries to call "foo" defined in namespace "A"
            // then calls global function "foo"

\foo();     // calls function "foo" defined in global scope

my\foo();   // calls function "foo" defined in namespace "A\my"

F();        // first tries to call "F" defined in namespace "A"
            // then calls global function "F"

// class references

new B();    // creates object of class "B" defined in namespace "A"
            // if not found, it tries to autoload class "A\B"

new D();    // using import rules, creates object of class "D" defined in namespace "B"
            // if not found, it tries to autoload class "B\D"

new F();    // using import rules, creates object of class "E" defined in namespace "C"
            // if not found, it tries to autoload class "C\E"

new \B();   // creates object of class "B" defined in global scope
            // if not found, it tries to autoload class "B"

new \D();   // creates object of class "D" defined in global scope
            // if not found, it tries to autoload class "D"

new \F();   // creates object of class "F" defined in global scope
            // if not found, it tries to autoload class "F"

// static methods/namespace functions from another namespace

B\foo();    // calls function "foo" from namespace "A\B"

B::foo();   // calls method "foo" of class "B" defined in namespace "A"
            // if class "A\B" not found, it tries to autoload class "A\B"

D::foo();   // using import rules, calls method "foo" of class "D" defined in namespace "B"
            // if class "B\D" not found, it tries to autoload class "B\D"

\B\foo();   // calls function "foo" from namespace "B"

\B::foo();  // calls method "foo" of class "B" from global scope
            // if class "B" not found, it tries to autoload class "B"

// static methods/namespace functions of current namespace

A\B::foo();   // calls method "foo" of class "B" from namespace "A\A"
              // if class "A\A\B" not found, it tries to autoload class "A\A\B"

\A\B::foo();  // calls method "foo" of class "B" from namespace "A\B"
              // if class "A\B" not found, it tries to autoload class "A\B"
?>
]]>
   </programlisting>
  </example>
 </sect1>
 <sect1 xml:id="language.namespaces.faq">
  <title>FAQ: things you need to know about namespaces</title>
  <para>
   This FAQ is split into two sections: common questions, and some specifics of
   implementation that are helpful to understand fully.
  </para>
  <para>
   First, the common questions.
   <orderedlist>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.shouldicare">If I don't use namespaces, should
      I care about any of this?</link>
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.globalclass">How do I use internal or global
      classes in a namespace?</link>
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.innamespace">How do I use namespaces classes
      functions, or constants in their own namespace?</link>
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.full">
       How does a name like <literal>\my\name</literal> or <literal>\name</literal>
       resolve?
      </link>
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.qualified">How does a name like
      <literal>my\name</literal> resolve?</link>
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.shortname1">How does an unqualified class name
      like <literal>name</literal> resolve?</link>
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.shortname2">How does an unqualified function
      name or unqualified constant name
      like <literal>name</literal> resolve?</link>
     </simpara>
    </listitem>
   </orderedlist>
  </para>
  <para>
   There are a few implementation details of the namespace implementations
   that are helpful to understand.
   <orderedlist>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.conflict">Import names cannot conflict with
      classes defined in the same file.</link>
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.nested">Nested namespaces are not allowed.
      </link>
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.nofuncconstantuse">Neither functions nor
      constants can be imported via the <literal>use</literal>
      statement.</link>
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.quote">Dynamic namespace names (quoted
      identifiers) should escape backslash.</link>
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.constants">Undefined Constants referenced
      using any backslash die with fatal error</link>
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      <link linkend="language.namespaces.faq.builtinconst">Cannot override special
      constants NULL, TRUE, FALSE, ZEND_THREAD_SAFE or ZEND_DEBUG_BUILD</link>
     </simpara>
    </listitem>
   </orderedlist>
  </para>
  <sect2 xml:id="language.namespaces.faq.shouldicare">
   <title>If I don't use namespaces, should I care about any of this?</title>
   <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:
   </para>
   <para>
    <example>
     <title>Accessing global classes outside a namespace</title>
     <programlisting role="php">
<![CDATA[
<?php
$a = new \stdClass;
]]>
     </programlisting>
    </example>
   </para>
   <para>
    This is functionally equivalent to:
   </para>
   <para>
    <example>
     <title>Accessing global classes outside a namespace</title>
     <programlisting role="php">
<![CDATA[
<?php
$a = new stdClass;
]]>
     </programlisting>
    </example>
   </para>
  </sect2>
  <sect2 xml:id="language.namespaces.faq.globalclass">
   <title>How do I use internal or global classes in a namespace?</title>
   <para>
    <example>
     <title>Accessing internal classes in namespaces</title>
     <programlisting role="php">
<![CDATA[
<?php
namespace foo;
$a = new \stdClass;

function test(\ArrayObject $typehintexample = null) {}

$a = \DirectoryIterator::CURRENT_AS_FILEINFO;

// extending an internal or global class
class MyException extends \Exception {}
?>
]]>
     </programlisting>
    </example>
   </para>
  </sect2>
  <sect2 xml:id="language.namespaces.faq.innamespace">
   <title>
    How do I use namespaces classes, functions, or constants in their own
    namespace?
   </title>
   <para>
    <example>
     <title>Accessing internal classes, functions or constants in namespaces</title>
     <programlisting role="php">
<![CDATA[
<?php
namespace foo;

class MyClass {}

// using a class from the current namespace as a type hint
function test(MyClass $typehintexample = null) {}
// another way to use a class from the current namespace as a type hint
function test(\foo\MyClass $typehintexample = null) {}

// extending a class from the current namespace
class Extended extends MyClass {}

// accessing a global function
$a = \globalfunc();

// accessing a global constant
$b = \INI_ALL;
?>
]]>
     </programlisting>
    </example>
   </para>
  </sect2>
  <sect2 xml:id="language.namespaces.faq.full">
   <title>
     How does a name like <literal>\my\name</literal> or <literal>\name</literal>
     resolve?
   </title>
   <para>
    Names that begin with a <literal>\</literal> always resolve to what they
    look like, so <literal>\my\name</literal> is in fact <literal>my\name</literal>,
    and <literal>\Exception</literal> is <literal>Exception</literal>.
    <example>
     <title>Fully Qualified names</title>
     <programlisting role="php">
<![CDATA[
<?php
namespace foo;
$a = new \my\name(); // instantiates "my\name" class
echo \strlen('hi'); // calls function "strlen"
$a = \INI_ALL; // $a is set to the value of constant "INI_ALL"
?>
]]>
     </programlisting>
    </example>
   </para>
  </sect2>
  <sect2 xml:id="language.namespaces.faq.qualified">
   <title>How does a name like <literal>my\name</literal> resolve?</title>
   <para>
    Names that contain a backslash but do not begin with a backslash like
    <literal>my\name</literal> can be resolved in 2 different ways.
   </para>
   <para>
    If there is
    an import statement that aliases another name to <literal>my</literal>, then
    the import alias is applied to the <literal>my</literal> in <literal>my\name</literal>.
   </para>
   <para>
    Otherwise, the current namespace name is prepended to <literal>my\name</literal>.
   </para>
   <para>
    <example>
     <title>Qualified names</title>
     <programlisting role="php">
<![CDATA[
<?php
namespace foo;
use blah\blah as foo;

$a = new my\name(); // instantiates "foo\my\name" class
foo\bar::name(); // calls static method "name" in class "blah\blah\bar"
my\bar(); // calls function "foo\my\bar"
$a = my\BAR; // sets $a to the value of constant "foo\my\BAR"
?>
]]>
     </programlisting>
    </example>
   </para>
  </sect2>
  <sect2 xml:id="language.namespaces.faq.shortname1">
   <title>How does an unqualified class name like <literal>name</literal> resolve?</title>
   <para>
    Class names that do not contain a backslash like
    <literal>name</literal> can be resolved in 2 different ways.
   </para>
   <para>
    If there is
    an import statement that aliases another name to <literal>name</literal>, then
    the import alias is applied.
   </para>
   <para>
    Otherwise, the current namespace name is prepended to <literal>name</literal>.
   </para>
   <para>
    <example>
     <title>Unqualified class names</title>
     <programlisting role="php">
<![CDATA[
<?php
namespace foo;
use blah\blah as foo;

$a = new name(); // instantiates "foo\name" class
foo::name(); // calls static method "name" in class "blah\blah"
?>
]]>
     </programlisting>
    </example>
   </para>
  </sect2>
  <sect2 xml:id="language.namespaces.faq.shortname2">
   <title>
    How does an unqualified function name or unqualified constant name
    like <literal>name</literal> resolve?
   </title>
   <para>
    Function or constant names that do not contain a backslash like
    <literal>name</literal> can be resolved in 2 different ways.
   </para>
   <para>
    First, the current namespace name is prepended to <literal>name</literal>.
   </para>
   <para>
    Finally, if the constant or function <literal>name</literal> does not exist
    in the current namespace, a global constant or function <literal>name</literal>
    is used if it exists.
   </para>
   <para>
    <example>
     <title>Unqualified function or constant names</title>
     <programlisting role="php">
<![CDATA[
<?php
namespace foo;
use blah\blah as foo;

const FOO = 1;

function my() {}
function foo() {}
function sort(&$a)
{
    sort($a);
    $a = array_flip($a);
    return $a;
}

my(); // calls "foo\my"
$a = strlen('hi'); // calls global function "strlen" because "foo\strlen" does not exist
$arr = array(1,3,2);
$b = sort($arr); // calls function "foo\sort"
$c = foo(); // calls function "foo\foo" - import is not applied

$a = FOO; // sets $a to value of constant "foo\FOO" - import is not applied
$b = INI_ALL; // sets $b to value of global constant "INI_ALL"
?>
]]>
     </programlisting>
    </example>
   </para>
  </sect2>
  <sect2 xml:id="language.namespaces.faq.conflict">
   <title>Import names cannot conflict with classes defined in the same file.</title>
   <para>
    The following script combinations are legal:
    <informalexample>
     <simpara>file1.php</simpara>
     <programlisting role="php">
     <![CDATA[
<?php
namespace my\stuff;
class MyClass {}
?>
     ]]>
     </programlisting>
     <simpara>another.php</simpara>
     <programlisting role="php">
     <![CDATA[
<?php
namespace another;
class thing {}
?>
     ]]>
     </programlisting>
     <simpara>file2.php</simpara>
     <programlisting role="php">
     <![CDATA[
<?php
namespace my\stuff;
include 'file1.php';
include 'another.php';

use another\thing as MyClass;
$a = new MyClass; // instantiates class "thing" from namespace another
?>
     ]]>
     </programlisting>
    </informalexample>
   </para>
   <para>
    There is no name conflict, even though the class <literal>MyClass</literal> exists
    within the <literal>my\stuff</literal> 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.
    <informalexample>
     <programlisting role="php">
     <![CDATA[
<?php
namespace my\stuff;
use another\thing as MyClass;
class MyClass {} // fatal error: MyClass conflicts with import statement
$a = new MyClass;
?>
     ]]>
     </programlisting>
    </informalexample>
   </para>
  </sect2>
  <sect2 xml:id="language.namespaces.faq.nested">
   <title>Nested namespaces are not allowed.</title>
   <para>
    PHP does not allow nesting namespaces
    <informalexample>
     <programlisting role="php">
     <![CDATA[
<?php
namespace my\stuff {
    namespace nested {
        class foo {}
    }
}
?>
     ]]>
     </programlisting>
    </informalexample>
    However, it is easy to simulate nested namespaces like so:
    <informalexample>
     <programlisting role="php">
     <![CDATA[
<?php
namespace my\stuff\nested {
    class foo {}
}
?>
     ]]>
     </programlisting>
    </informalexample>
   </para>
  </sect2>
  <sect2 xml:id="language.namespaces.faq.nofuncconstantuse">
   <title>Neither functions nor constants can be imported via the <literal>use</literal>
      statement.</title>
   <para>
    The only elements that are affected by <literal>use</literal> statements are namespaces
    and class names.  In order to shorten a long constant or function, import its containing
    namespace
    <informalexample>
     <programlisting role="php">
     <![CDATA[
<?php
namespace mine;
use ultra\long\ns\name;

$a = name\CONSTANT;
name\func();
?>
     ]]>
     </programlisting>
    </informalexample>
   </para>
  </sect2>
  <sect2 xml:id="language.namespaces.faq.quote">
   <title>Dynamic namespace names (quoted identifiers) should escape backslash</title>
   <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:
    <example>
     <title>Dangers of using namespaced names inside a double-quoted string</title>
     <programlisting role="php">
      <![CDATA[
<?php
$a = new "dangerous\name"; // \n is a newline inside double quoted strings!
$obj = new $a;

$a = new 'not\at\all\dangerous'; // no problems here.
$obj = new $a;
?>
      ]]>
     </programlisting>
    </example>
    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.
   </para>
  </sect2>
  <sect2 xml:id="language.namespaces.faq.constants">
   <title>Undefined Constants referenced using any backslash die with fatal error</title>
   <para>
    Any undefined constant that is unqualified like <literal>FOO</literal> will
    produce a notice explaining that PHP assumed <literal>FOO</literal> was the value
    of the constant.  Any constant, qualified or fully qualified, that contains a
    backslash will produce a fatal error if not found.
    <example>
     <title>Undefined constants</title>
     <programlisting role="php">
      <![CDATA[
<?php
namespace bar;
$a = FOO; // produces notice - undefined constants "FOO" assumed "FOO";
$a = \FOO; // fatal error, undefined namespace constant FOO
$a = Bar\FOO; // fatal error, undefined namespace constant bar\Bar\FOO
$a = \Bar\FOO; // fatal error, undefined namespace constant Bar\FOO
?>
      ]]>
     </programlisting>
    </example>
   </para>
  </sect2>
  <sect2 xml:id="language.namespaces.faq.builtinconst">
   <title>Cannot override special constants NULL, TRUE, FALSE, ZEND_THREAD_SAFE or ZEND_DEBUG_BUILD</title>
   <para>
    Any attempt to define a namespaced constant that is a special, built-in constant
    results in a fatal error
    <example>
     <title>Undefined constants</title>
     <programlisting role="php">
      <![CDATA[
<?php
namespace bar;
const NULL = 0; // fatal error;
const true = 'stupid'; // also fatal error;
// etc.
?>
      ]]>
     </programlisting>
    </example>
   </para>
  </sect2>
 </sect1>
</chapter>

<!-- Keep this comment at the end of the file
 Local variables:
 mode: sgml
 sgml-omittag:t
 sgml-shorttag:t
 sgml-minimize-attributes:nil
 sgml-always-quote-attributes:t
 sgml-indent-step:1
 sgml-indent-data:t
 indent-tabs-mode:nil
 sgml-parent-document:nil
 sgml-default-dtd-file:"~/.phpdoc/manual.ced"
 sgml-exposed-tags:nil
 sgml-local-catalogs:nil
 sgml-local-ecat-files:nil
 End:
 vim600: syn=xml fen fdm=syntax fdl=2 si
 vim: et tw=78 syn=sgml
 vi: ts=1 sw=1
-->