Php get namespace of class

The namespace of class Foo\Bar\A is Foo\Bar, so the __NAMESPACE__ is working very well. What you are looking for is probably namespaced classname that you could easily get by joining echo __NAMESPACE__ . '\\' . __CLASS__;.

Show

Consider next example:

namespace Foo\Bar\FooBar;

use Ping\Pong\HongKong;

class A extends HongKong\B {

    function __construct() {
        echo __NAMESPACE__;
    }
}

new A;

Will print out Foo\Bar\FooBar which is very correct...

And even if you then do

namespace Ping\Pong\HongKong;

use Foo\Bar\FooBar;

class B extends FooBar\A {

    function __construct() {
        new A;
    }
}

it will echo Foo\Bar\FooBar, which again is very correct...

EDIT: If you need to get the namespace of the nested class within the main that is nesting it, simply use:

namespace Ping\Pong\HongKong;

use Foo\Bar\FooBar;

class B extends FooBar\A {

    function __construct() {
        $a = new A;
        echo $a_ns = substr(get_class($a), 0, strrpos(get_class($a), '\\'));
    }
}

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ReflectionClass::getNamespaceNameGets namespace name

Description

public ReflectionClass::getNamespaceName(): string

Parameters

This function has no parameters.

Return Values

The namespace name.

Examples

Example #1 ReflectionClass::getNamespaceName() example

<?php
namespace A\B;

class

Foo { }$class = new \ReflectionClass('stdClass');var_dump($class->inNamespace());
var_dump($class->getName());
var_dump($class->getNamespaceName());
var_dump($class->getShortName());$class = new \ReflectionClass('A\\B\\Foo');var_dump($class->inNamespace());
var_dump($class->getName());
var_dump($class->getNamespaceName());
var_dump($class->getShortName());
?>

The above example will output:

bool(false)
string(8) "stdClass"
string(0) ""
string(8) "stdClass"

bool(true)
string(7) "A\B\Foo"
string(3) "A\B"
string(3) "Foo"

francois

11 years ago

If the object does not belong to a namespace, an empty string is returned

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

PHP supports two ways of abstractly accessing elements within the current namespace, the __NAMESPACE__ magic constant, and the namespace keyword.

The value of __NAMESPACE__ is a string that contains the current namespace name. In global, un-namespaced code, it contains an empty string.

Example #1 __NAMESPACE__ example, namespaced code

<?php
namespace MyProject;

echo

'"'__NAMESPACE__'"'// outputs "MyProject"
?>

Example #2 __NAMESPACE__ example, global code

<?phpecho '"'__NAMESPACE__'"'// outputs ""
?>

The __NAMESPACE__ constant is useful for dynamically constructing names, for instance:

Example #3 using __NAMESPACE__ for dynamic name construction

<?php
namespace MyProject;

function

get($classname)
{
    
$a __NAMESPACE__ '\\' $classname;
    return new 
$a;
}
?>

The namespace keyword can be used to explicitly request an element from the current namespace or a sub-namespace. It is the namespace equivalent of the self operator for classes.

Example #4 the namespace operator, inside a namespace

<?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
?>

Example #5 the namespace operator, in global code

<?phpnamespace\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
?>

a dot schaffhirt at sedna-soft dot de

12 years ago

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.

bharatthapa45 at gmail dot com

5 months ago

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();?>

cornichonche at gmail dot com

4 years ago

The example 4 is wrong.
Using php 7.2

<?php
namespace monProjet;

use function

blah\blah as mine; blah\mine(); // Will NOT work
mine(); // Will work
?>