Using namespaces: Aliasing/Importing

(PHP 5 >= 5.3.0)

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.

PHP namespaces support three kinds of aliasing or importing: aliasing a class name, aliasing an interface name, and aliasing a namespace name. Note that importing a function or constant is not supported.

In PHP, aliasing is accomplished with the use operator. Here is an example showing all 3 kinds of importing:

Example #1 importing/aliasing with the use operator

<?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
?>
Note that for namespaced names (fully qualified namespace names containing namespace separator, such as Foo\Bar as opposed to global names that do not, such as FooBar), the leading backslash is unnecessary and not recommended, as import names must be fully qualified, and are not processed relative to the current namespace.

PHP additionally supports a convenience shortcut to place multiple use statements on the same line

Example #2 importing/aliasing with the use operator, multiple use statements combined

<?php
use My\Full\Classname as AnotherMy\Full\NSname;

$obj = new Another// instantiates object of class My\Full\Classname
NSname\subns\func(); // calls function My\Full\NSname\subns\func
?>

Importing is performed at compile-time, and so does not affect dynamic class, function or constant names.

Example #3 Importing and dynamic names

<?php
use My\Full\Classname as AnotherMy\Full\NSname;

$obj = new Another// instantiates object of class My\Full\Classname
$a 'Another';
$obj = new $a;      // instantiates object of class Another
?>

In addition, importing only affects unqualified and qualified names. Fully qualified names are absolute, and unaffected by imports.

Example #4 Importing and fully qualified names

<?php
use My\Full\Classname as AnotherMy\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
?>

Scoping rules for importing

The use keyword must be declared in the outermost scope of a file (the global scope) or inside namespace declarations. This is because the importing is done at compile time and not runtime, so it cannot be block scoped. The following example will show an illegal use of the use keyword:

Example #5 Illegal importing rule

<?php
namespace Languages;

class 
Greenlandic
{
    use 
Languages\Danish;

    ...
}
?>

Note:

Importing rules are per file basis, meaning included files will NOT inherit the parent file's importing rules.

Коментарии

Because imports happen at compile time, there's no polymorphism potential by embedding the use keyword in a conditonal.

e.g.:

<?php
if ($objType == 'canine') {
  use 
Animal\Canine as Beast;
}
if (
$objType == 'bovine') {
  use 
Animal\Bovine as Beast;
}

$oBeast = new Beast;
$oBeast->feed();
?>
2010-12-02 00:07:28
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
If you are testing your code at the CLI, note that namespace aliases do not work!

(Before I go on, all the backslashes in this example are changed to percent signs because I cannot get sensible results to display in the posting preview otherwise. Please mentally translate all percent signs henceforth as backslashes.)

Suppose you have a class you want to test in myclass.php:

<?php
namespace my%space;
class 
myclass {
 
// ...
}
?>

and you then go into the CLI to test it. You would like to think that this would work, as you type it line by line:

require 'myclass.php';
use my%space%myclass; // should set 'myclass' as alias for 'my%space%myclass'
$x = new myclass; // FATAL ERROR

I believe that this is because aliases are only resolved at compile time, whereas the CLI simply evaluates statements; so use statements are ineffective in the CLI.

If you put your test code into test.php:
<?php
require 'myclass.php';
use 
my%space%myclass;
$x = new myclass;
//...
?>
it will work fine.

I hope this reduces the number of prematurely bald people.
2011-08-14 18:26:15
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
You are allowed to "use" the same resource multiple times as long as it is imported under a different alias at each invocation.

For example:

<?php
use Lend;
use 
Lend\l1;
use 
Lend\l1 as l3;
use 
Lend\l2;
use 
Lend\l1\Keller;
use 
Lend\l1\Keller as Stellar;
use 
Lend\l1\Keller as Zellar;
use 
Lend\l2\Keller as Dellar;

...

?>

In the above example, "Keller", "Stellar", and "Zellar" are all references to "\Lend\l1\Keller", as are "Lend\l1\Keller", "l1\Keller", and "l3\Keller".
2013-01-02 07:13:13
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Автор:
Something that is not immediately obvious, particular with PHP 5.3, is that namespace resolutions within an import are not resolved recursively.  i.e.: if you alias an import and then use that alias in another import then this latter import will not be fully resolved with the former import.

For example:
use \Controllers as C;
use C\First;
use C\Last;

Both the First and Last namespaces are NOT resolved as \Controllers\First or \Controllers\Last as one might intend.
2013-03-11 02:59:11
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Автор:
The last example on this page shows a possibly incorrect attempt of aliasing, but it is totally correct to import a trait \Languages\Languages\Danish.
2013-04-03 13:02:25
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Note that you can not alias global namespace:

use \ as test;

echo test\strlen('');

won't work.
2013-04-07 16:32:55
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Автор:
The <?php use ?> statement does not load the class file. You have to do this with the <?php require ?> statement or by using an autoload function.
2014-01-30 23:08:48
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
For the fifth example (example #5):

When in block scope, it is not an illegal use of use keyword, because it is used for sharing things with traits.
2015-03-10 19:50:34
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Note the code `use ns1\c1` may refer to importing class `c1` from namespace `ns1` as well as importing whole namespace `ns1\c1` or even import both of them in one line. Example:

<?php
namespace ns1;

class 
c1{}

namespace 
ns1\c1;

class 
c11{}

namespace 
main;

use 
ns1\c1;

$c1 = new c1();
$c11 = new c1\c11();

var_dump($c1); // object(ns1\c1)#1 (0) { }
var_dump($c11); // object(ns1\c1\c11)#2 (0) { }
2016-03-31 10:34:26
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
The keyword "use" has been recycled for three distinct applications: 
1- to import/alias classes, traits, constants, etc. in namespaces, 
2- to insert traits in classes, 
3- to inherit variables in closures. 
This page is only about the first application: importing/aliasing. Traits can be inserted in classes, but this is different from importing a trait in a namespace, which cannot be done in a block scope, as pointed out in example 5. This can be confusing, especially since all searches for the keyword "use" are directed to the documentation here on importing/aliasing.
2016-09-20 13:50:35
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
To clarify the distinction between inserting a trait in a class and importing a trait in a namespace, here is an example where we first import and then insert a trait. 

<?php
namespace ns1;
trait 
{
  static 
$a "In T";
}

namespace 
ns2;
use 
ns1\T// Importing the name of trait ns1\T  in the namespace ns2
class 
  use 
T// Inserting trait T in the class C, making use of the imported name. 


namespace 
main;
use 
ns2\C;
echo 
C::$a// In T;
2016-09-20 14:18:47
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Note that "use" importing/aliasing only applies to the current namespace block.

<?php

namespace SuperCoolLibrary
{
    class 
Meta
   
{
        static public function 
getVersion()
        {
            return 
'2.7.1';
        }
    }
}

namespace
{
    use 
SuperCoolLibrary\Meta;
    echo 
Meta::getVersion();//outputs 2.7.1
}

namespace
{
    echo 
Meta::getVersion();//fatal error
}

?>

To get the expected behavior, you'd use:
class_alias('SuperCoolLibrary\Meta','Meta');
2016-09-30 13:53:08
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Автор:
In Chinese,there is an error in translation:
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
it should be
// 如果不使用 "use ArrayObject" ,则实例化一个 foo\ArrayObject 对象

/*********************************************/
中文下翻译有错误
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
这句话应该是
// 如果不使用 "use ArrayObject" ,则实例化一个 foo\ArrayObject 对象
2017-02-15 08:16:02
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
I couldn't find answer to this question so I tested myself. 
I think it's worth noting:

<?php
use ExistingNamespace\NonExsistingClass;
use 
ExistingNamespace\NonExsistingClass as whatever;
use 
NonExistingNamespace\NonExsistingClass;
use 
NonExistingNamespace\NonExsistingClass as whatever;
?>

None of above will actually cause errors unless you actually try to use class you tried to import. 

<?php
// And this code will issue standard PHP error for non existing class.
use ExistingNamespace\NonExsistingClass as whatever;
$whatever = new whatever();
?>
2017-05-04 14:13:39
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Автор:
Here is a handy way of importing classes, functions and conts using a single use keyword:

<?php
use Mizo\Web\ {
   
Php\WebSite,
   
Php\KeyWord,
   
Php\UnicodePrint,
   
JS\JavaScript
   function 
JS\printTotal
   function 
JS\printList
   const 
JS\BUAIKUM
   const 
JS\MAUTAM
};
?>
2017-10-21 08:03:04
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Автор:
For those hoping for an easy fix of DRY with {} unfortunately you can't nest it or do anything cool with it. In case you can only have one per use and if you don't have one then the whole use is assumed to be wrapped in brackets. That means if you do have one you can't use , as normal with use!

Not possible:

    use A\B\C\{
            D, E,
            F\{X, Y, Z}
        },
        X\Y\Z,
        H\{
            I\{
                Y\Y\Y\Y\Y,
                Z, H, E
            },
            J\{
                A\{
                    G\H\J
                    B\N
                },
                G\H\J
            }
        };
2018-03-29 17:25:11
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Автор:
amazing!!

use function strval as numberToString;

var_dump(numberToString(123));

//print
//string(3) "123"
2019-06-07 04:59:08
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Автор:
namespace test{

    use test\xyz\tikku;
    use test\xyz\tikku as class_alias;
    use function test\xyz\tikku\foo;
    use function test\xyz\tikku\foo as func_alias;
    use const test\xyz\tikku\ABC;
    use const test\xyz\tikku\ABC as const_alias;
   

   

    $obj=new tikku;
    $obj->Display();  // I am in  test\xyz namespace

    $obj=new tikku\dhairya;
    $obj->Display();   // I am in test\xyz\tikku namespace

    $obj=new class_alias\dhairya;
    $obj->Display();   // I am in test\xyz\tikku namespace

    $obj=new \class_alias\dhairya;
    $obj->Display();  // I am in class_alias namespace

}

namespace test\xyz{

   class tikku{
    function Display(){
        echo "I am in ".__namespace__." namespace<br/><hr/>"; 
    }
   }
}

namespace test\xyz\tikku{

   class dhairya{
    function Display(){
        echo "I am in ".__namespace__." namespace<br/><hr/>"; 
    }
   }
}

namespace class_alias{

   class dhairya{
    function Display(){
        echo "I am in ".__namespace__." namespace<br/><hr/>"; 
    }
   }
}
2019-07-27 16:41:46
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Note: you can import not existed items without errors:
<?php
use UndefinedClass;
use function 
undefined_fn;
use const 
UNDEFINED_CONST;
?>
but you cant use/call they:
<?php
$new UndefinedClass
// Error: Use of undefined class
use function undefined_fn// Error: Use of undefined function
use const UNDEFINED_CONST// Error: Use of undefined constant
?>
2020-09-06 01:48:46
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Bear in mind that it's perfectly fine to alias namespaces, ie:

<?php
use A\B\C\D\E\User;

new 
User();
?>

can be also written as:

<?php
use A\B\C\D\E as ENamespace;

new 
ENamespace\User();
?>

however following will not work:

<?php
use A\B\C\D\E as ENamespace;
use 
ENamespace\User;

new 
User();
?>

> PHP Error:  Class "ENamespace\User" not found
2021-03-14 19:14:59
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html
Автор:
Note that because this is processed at compile time, this doesn't work when running PHP in interactive mode. use commands won't throw an error, but they won't do anything, either.
2022-05-27 19:32:29
http://php5.kiev.ua/manual/ru/language.namespaces.importing.html

    Поддержать сайт на родительском проекте КГБ