Note that __CLASS__ and __METHOD__ both reference the class the code is written in, not whatever the object class is. E.g. if you have an object of class B inheriting from class A, any usage of __CLASS__ in class A is going to give "A".
There are nine magical constants that change depending on
where they are used. For example, the value of
__LINE__
depends on the line that it's
used on in your script. All these "magical" constants are resolved
at compile time, unlike regular constants, which are resolved at runtime.
These special constants are case-insensitive and are as follows:
Name | Description |
---|---|
__LINE__ |
The current line number of the file. |
__FILE__ |
The full path and filename of the file with symlinks resolved. If used inside an include, the name of the included file is returned. |
__DIR__ |
The directory of the file. If used inside an include,
the directory of the included file is returned. This is equivalent
to dirname(__FILE__) . This directory name
does not have a trailing slash unless it is the root directory.
|
__FUNCTION__ |
The function name, or {closure} for anonymous functions.
|
__CLASS__ |
The class name. The class name includes the namespace
it was declared in (e.g. Foo\Bar ).
When used
in a trait method, __CLASS__ is the name of the class the trait
is used in.
|
__TRAIT__ |
The trait name. The trait name includes the namespace
it was declared in (e.g. Foo\Bar ).
|
__METHOD__ |
The class method name. |
__NAMESPACE__ |
The name of the current namespace. |
ClassName::class |
The fully qualified class name. |
Note that __CLASS__ and __METHOD__ both reference the class the code is written in, not whatever the object class is. E.g. if you have an object of class B inheriting from class A, any usage of __CLASS__ in class A is going to give "A".
If PHP is run inside a web server request there is an important difference between the __DIR__ constant and $_SERVER['DOCUMENT_ROOT'].
Where __DIR__ of a PHP script contained within a sub-folder will include the complete server path $_SERVER['DOCUMENT_ROOT'] will contain a server path up to the _root_ of the application. This can be helpful when for instance an auto-loader is defined in an include file sitting inside a sub-folder and where the classes are located in another folder at the root of the application.
<?php
namespace My\App {
class Api {
public static fetch() {
print __FUNCTION__ . "\n"; // outputs fetch
print __METHOD__ . "\n"; // outputs My\App\Api::fetch
}
}
Api::fetch();
}
namespace {
My\App\Api::fetch();
}
?>
__METHOD__ outputs a fully qualified method name; __FUNCTION__ when used in a method, outputs just the method name.
You can implement magic constants as given below example:
<?php
namespace UserModel {
class User {
public function __construct() {
echo 'I am in '.__CLASS__.'</br>';
}
public function showData() {
echo 'I am in '.__METHOD__.'</br>';
}
}
$obj = new User;
$obj->showData();
echo __NAMESPACE__;
}
?>