概述
PHP提供了9個魔術常數,您可以在PHP應用程式程式碼中使用。它們是「神奇的」,因為它們是在編譯時定義的,不像常規常量(您可以自己定義)是在執行時定義的。這意味著它們的值可以根據它們在程式碼中的使用位置而更改。
FUNCTION
__FUNCTION__
魔術常量返回使用它的函式的名稱。如果在函式或方法之外使用它,它將返回空字串。
在函式中使用
__FUNCTION__
假設你有一個名為
myFunction
的函式:
functionmyFunction()
{
echo __FUNCTION__;
}
呼叫上面的函式將輸出:
myFunction
。
在類方法中使用
__FUNCTION__
假設你有一個類,它有一個名為
myMethod
的方法:
class My class
{
public functionmyMethod()
{
echo __FUNCTION__;
}
}
呼叫
myMethod
方法將輸出:
myMethod
。
在匿名函式中使用
__FUNCTION__
假設你有一個匿名函式:
$myFunction = function () {
echo __FUNCTION__;
};
呼叫
$myFunction
變量將輸出:
{closure}
。
__METHOD__
__METHOD__
魔術常量返回使用它的方法的名稱和編寫它的類。如果在函式或方法之外使用它,它將返回空字串。
在類方法中使用
__METHOD__
假設您有一個
App\Utilities\My class
類,其方法名為
myMethod
:
namespace App\Utilities;
class My class
{
public functionmyMethod()
{
echo __METHOD__;
}
}
呼叫
myMethod
方法將輸出:
App\Utilities\My class::myMethod
。
在父類方法中使用
__METHOD__
常量返回常量所在的類和方法名。這意味著如果你在父類中使用
__METHOD__
,任何子類別都將使用父類的名稱。
例如,假設你有一個名為
App\Utilities\Parent class
的父類:
namespace App\Utilities;
class Parent class
{
public functionmyMethod()
{
echo __METHOD__;
}
}
你有一個名為
App\Utilities\Child class
的子類別,它擴充套件了
App\Utilities\Parent class
類:
namespace App\Utilities;
class Child class extends Parent class
{
// ...
}
呼叫
(new Child class())->myMethod()
方法將輸出:
App\Utilities\Parent class::myMethod
。
在函式中使用
__METHOD__
如果你在一個函式中呼叫
__METHOD__
,輸出將與
__FUNCTION__
相同。所以它只會輸出函式的名稱。
類似地,如果你在一個匿名函式中呼叫
__METHOD__
,輸出將與
__FUNCTION__
相同。所以它只會輸出
{closure}
。
__ class__
__ class__
魔術常量返回使用它的類的名稱。如果在類外使用它,它將返回一個空字串。
在類方法中使用
__ class__
假設你有以下程式碼:
namespace App\Utilities;
class My class
{
public functionmyMethod()
{
echo __ class__;
}
}
呼叫
myMethod
方法將輸出:
My class
。
在父類中使用
__ class__
與
__METHOD__
魔術常量類似,
__ class__
常量將返回寫入它的類的名稱。這意味著如果你在父類中使用
__ class__
,那麽父類的名字將被使用,而不是子類別的名字。
例如,假設你有一個名為
App\Utilities\Parent class
的父類:
namespace App\Utilities;
class Parent class
{
public functionmyMethod()
{
echo __ class__;
}
}
你有一個名為
App\Utilities\Child class
的子類別,它擴充套件了
App\Utilities\Parent class
類:
namespace App\Utilities;
class Child class extends Parent class
{
// ...
}
呼叫
(new Child class())->myMethod()
方法將輸出:
App\Utilities\Parent class
。
在Trait中使用
__ class__
如果在trait中使用了
__ class__
常量,它將返回使用trait的類的名稱。
例如,假設你有一個名為
MyTrait
的trait:
namespace App\Utilities;
trait MyTrait
{
public functionmyMethod()
{
echo __ class__;
}
}
你有一個名為
My class
的類,它使用了
MyTrait
trait:
namespace App\Utilities;
class My class
{
use MyTrait;
}
呼叫
(new My class())->myMethod()
方法將輸出:
App\Utilities\My class
。
:: class
:: class
魔術常量返回類的完全限定類名。
這是我發現自己使用最多的魔法常數,特別是在Laravel應用程式中。當您使用字串形式的類名時,它特別有用。
假設你有下面的類,
App\Utilities\My class
:
namespace App\Utilities;
class My class
{
// ...
}
呼叫
App\Utilities\My class:: class
將輸出:
App\Utilities\My class
。
在Laravel中使用
:: class
如果你是一個Laravel開發者,你會看到這個常量以前用於定義路由和模型關系。
例如,要在Laravel中定義一個web路由,你可以在你的
routes/web.php
檔中這樣做:
use App\Http\Controllers\UserController;
Route::get('/users', [UserController:: class, 'index']);
註意我們是如何使用
:: class
常量來參照
UserController
類的,這將給我們
App\Http\Controllers\UserController
。類似地,當在Laravel模型中定義關系時,你可以這樣做:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class User extends Model
{
public function posts(): HasMany
{
return$this->hasMany(Post:: class);
}
}
在上面的例子中,我們使用
:: class
常量來獲取
Post
模型類的完全限定名,這將給我們
App\Models\Post
。
TRAIT
__TRAIT__
magic常量返回使用它的trait的完全限定名。如果在trait之外使用,它將返回一個空字串。
例如,假設我們有以下特質:
namespace App\Utilities;
trait MyTrait
{
public functionmyMethod()
{
echo __TRAIT__;
}
}
我們有一個使用
MyTrait
trait的類:
namespace App\Utilities;
class My class
{
use MyTrait;
}
呼叫
(new My class())->myMethod()
方法將輸出:
App\Utilities\MyTrait
。
NAMESPACE
__NAMESPACE__
魔術常量返回當前使用它的名稱空間。如果檔不在名稱空間中,它將返回空字串。例如,假設我們有以下程式碼:
namespace App\Utilities;
echo __NAMESPACE__;
執行上面的程式碼會輸出:
App\Utilities
。
與
__METHOD__
和
__ class__
魔術常量類似,
__NAMESPACE__
常量將返回寫入它的檔的名稱空間。
例如,假設你有一個名為
App\Utilities\Parent class
的父類:
namespace App\Utilities;
class Parent class
{
public functionmyMethod()
{
echo __NAMESPACE__;
}
}
你有一個名為
App\Utilities\Child\Child class
的子類別,它擴充套件了
App\Utilities\Parent class
類:
namespace App\Utilities\Child;
class Child class extends Parent class
{
// ...
}
執行
(new Child class())->myMethod()
方法將輸出:
App\Utilities
。
LINE
__LINE__
魔術常量返回使用它的檔的當前行號。
例如,假設我們有以下程式碼:
<?php
// An empty line...
echo __LINE__;
執行上面的程式碼將輸出
5
,因為
echo __LINE__;
語句位於檔的第5行。
FILE
__FILE__
魔術常量返回使用它的檔的完整路徑和檔名。
例如,假設我們在位於
/Users/ashleyallen/my-app/index.php
的檔中有以下程式碼
echo __FILE__;
執行上面的程式碼將輸出
/Users/ashleyallen/my-app/index.php
。
DIR
__DIR__
魔術常量返回使用它的檔的目錄。
例如,假設我們在位於
/Users/ashleyallen/my-app/index.php
的檔中有以下程式碼
echo __DIR__;
執行上面的程式碼將輸出
/Users/ashleyallen/my-app
。
值得註意的是,除非目錄是根目錄,否則
__DIR__
常量不包含尾隨斜杠。
您也可以使用
dirname(__FILE__)
實作與
__DIR__
相同的值。