Just in case you wonder what the practical use of the namespace keyword is...
It can explicitly refer to classes from the current namespace regardless of possibly "use"d classes with the same name from other namespaces. However, this does not apply for functions.
Example:
<?php
namespace foo;
class Xyz {}
function abc () {}
?>
<?php
namespace bar;
class Xyz {}
function abc () {}
?>
<?php
namespace bar;
use foo\Xyz;
use foo\abc;
new Xyz(); // instantiates \foo\Xyz
new namespace\Xyz(); // instantiates \bar\Xyz
abc(); // invokes \bar\abc regardless of the second use statement
\foo\abc(); // it has to be invoked using the fully qualified name
?>
Hope, this can save someone from some trouble.
Best regards.Клучниот збор namespace и __NAMESPACE__
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Клучниот збор namespace и __NAMESPACE__
Референца за `language.namespaces.nsconstants.php` со подобрена типографија и навигација.
Клучниот збор namespace и магичната константа __NAMESPACE__
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
PHP поддржува два начина за апстрактно пристапување до елементи во тековниот простор на имиња, __NAMESPACE__ магичната константа, и namespace
keyword.
Вредноста на __NAMESPACE__ е стринг што го содржи името на тековниот простор на имиња. Во глобален код без простор на имиња, содржи празен стринг.
Пример #1 Пример на __NAMESPACE__, код со простор на имиња
<?php
namespace MyProject;
echo '"', __NAMESPACE__, '"'; // outputs "MyProject"
?>Пример #2 Пример на __NAMESPACE__, глобален код
<?php
echo '"', __NAMESPACE__, '"'; // outputs ""
?>__NAMESPACE__ константата е корисна за динамично конструирање имиња, на пример:
Пример #3 Користење на __NAMESPACE__ за динамична конструкција на имиња
<?php
namespace MyProject;
function get($classname)
{
$a = __NAMESPACE__ . '\\' . $classname;
return new $a;
}
?>
На namespace клучниот збор може да се користи за експлицитно барање елемент од тековниот простор на имиња или подпростор на имиња. Тоа е еквивалент на просторот на имиња на self операторот за класи.
Пример #4 Операторот за простор на имиња, внатре во простор на имиња
<?php
namespace MyProject;
use blah\blah as mine; // see "Using namespaces: Aliasing/Importing"
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
?>Пример #5 Операторот за простор на имиња, во глобален код
<?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
?>Белешки од корисници 2 забелешки
Difference between __NAMESPACE__ and keyword 'namespace' that I find relevant is when invoking a class:
<?php
namespace MyApp;
class App {
static function app(){
echo 'hello app';
}
}
// this will work:
$obj = new namespace\App::app();
// this will not work
$obj = new __NAMESPACE__\App::app();
// however this will work:
$obj = __NAMESPACE__ . '\App';
$obj::foo();
?>