當前位置: 妍妍網 > 碼農

PHP 中的魔術常量

2024-07-13碼農

概述

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__ 相同的值。