魔術常數是PHP中的預定義常數,根據它們的使用而改變。 它們以雙下劃線(__
)開頭,以雙下劃線結尾。
它們類似於其他預定義的常數,但是它們隨著上下文的改變而改變它們的值,它們被稱為魔術常數。
下表中定義了八個魔法常數。 它們不區分大小寫。
常數名稱 | 描述 |
---|---|
__LINE__ |
表示使用當前行號。 |
__FILE__ |
表示檔案的完整路徑和檔案名。 如果它在include 中使用,則返回包含檔案的名稱。 |
__DIR__ |
表示檔案的完整目錄路徑。 等同於dirname(__file__) 。 除非它是根目錄,否則它沒有尾部斜槓。 它還解析符號連結。 |
__FUNCTION__ |
表示使用它的函式名稱。如果它在任何函式之外使用,則它將返回空白。 |
__CLASS__ |
表示使用它的函式名稱。如果它在任何函式之外使用,則它將返回空白。 |
__TRAIT__ |
表示使用它的特徵名稱。 如果它在任何函式之外使用,則它將返回空白。 它包括它被宣告的名稱空間。 |
__METHOD__ |
表示使用它的類方法的名稱。方法名稱在有宣告時返回。 |
__NAMESPACE__ |
表示當前名稱空間的名稱。 |
下面來看看一個上面的每個魔法常數的例子。
檔案名:magic.php
<?php
echo "<h3>Example for __LINE__</h3>";
echo "You are at line number " . __LINE__ . "<br><br>";// print Your current line number i.e;3
echo "<h3>Example for __FILE__</h3>";
echo __FILE__ . "<br><br>";//print full path of file with .php extension
echo "<h3>Example for __DIR__</h3>";
echo __DIR__ . "<br><br>";//print full path of directory where script will be placed
echo dirname(__FILE__) . "<br><br>"; //its output is equivalent to above one.
echo "<h3>Example for __FUNCTION__</h3>";
//Using magic constant inside function.
function cash(){
echo 'the function name is '. __FUNCTION__ . "<br><br>";//the function name is cash.
}
cash();
//Using magic constant outside function gives the blank output.
function test_function(){
echo 'HYIIII';
}
test_function();
echo __FUNCTION__ . "<br><br>";//gives the blank output.
echo "<h3>Example for __CLASS__</h3>";
class abc
{
public function __construct() {
;
}
function abc_method(){
echo __CLASS__ . "<br><br>";//print name of the class abc.
}
}
$t = new abc;
$t->abc_method();
class first{
function test_first(){
echo __CLASS__;//will always print parent class which is first here.
}
}
class second extends first
{
public function __construct() {
;
}
}
$t = new second;
$t->test_first();
echo "<h3>Example for __TRAIT__</h3>";
trait created_trait{
function abc(){
echo __TRAIT__;//will print name of the trait created_trait
}
}
class anew{
use created_trait;
}
$a = new anew;
$a->abc();
echo "<h3>Example for __METHOD__</h3>";
class meth{
public function __construct() {
echo __METHOD__ . "<br><br>";//print meth::__construct
}
public function meth_fun(){
echo __METHOD__;//print meth::meth_fun
}
}
$a = new meth;
$a->meth_fun();
echo "<h3>Example for __NAMESPACE__</h3>";
class name{
public function __construct() {
echo 'This line will be printed on calling namespace';
}
}
$clas_name= __NAMESPACE__ .'\name';
$a = new $clas_name;
?>
執行上面程式碼得到以下結果 -