PHP Conference Japan 2024

預定義常數

PHP 為任何執行的腳本提供了大量的預定義常數。 然而,這些常數中有許多是由各種擴充功能建立的,並且只有在這些擴充功能可用的情況下才會存在,無論是透過動態載入還是因為它們已被編譯到程式中。

新增註解

使用者貢獻註解 5 則註解

291
vijaykoul_007 at rediffmail dot com
19 年前
在 PHP 5.0.4 中,
__FUNCTION__ 和 __METHOD__ 之間的差異在於

__FUNCTION__ 只會傳回函式的名稱

而 __METHOD__ 會傳回類別名稱以及函式名稱

class trick
{
function doit()
{
echo __FUNCTION__;
}
function doitagain()
{
echo __METHOD__;
}
}
$obj=new trick();
$obj->doit();
輸出結果將是 ---- doit
$obj->doitagain();
輸出結果將是 ----- trick::doitagain
49
Tomek Perlak [tomekperlak at tlen pl]
18 年前
__CLASS__ 魔術常數很好地補充了 get_class() 函數。

有時您需要知道兩者
- 繼承的類別名稱
- 實際執行的類別名稱

以下是一個顯示可能解決方案的範例

<?php

class base_class
{
function
say_a()
{
echo
"'a' - said the " . __CLASS__ . "<br/>";
}

function
say_b()
{
echo
"'b' - said the " . get_class($this) . "<br/>";
}

}

class
derived_class extends base_class
{
function
say_a()
{
parent::say_a();
echo
"'a' - said the " . __CLASS__ . "<br/>";
}

function
say_b()
{
parent::say_b();
echo
"'b' - said the " . get_class($this) . "<br/>";
}
}

$obj_b = new derived_class();

$obj_b->say_a();
echo
"<br/>";
$obj_b->say_b();

?>

輸出結果應大致如下

'a' - said the base_class
'a' - said the derived_class

'b' - said the derived_class
'b' - said the derived_class
11
php at kenman dot net
10 年前
剛學到一個關於 __FILE__ 和較新的 __DIR__ 在從網路共享執行程式碼時的有趣小知識:當從共享的內容執行時,常數將會傳回*共享*路徑。

範例

// 一般內容
// 以 "php -f c:\test.php" 呼叫
__DIR__ === 'c:\';
__FILE__ === 'c:\test.php';

// 網路共享內容
// 以 "php -f \\computerName\c$\test.php" 呼叫
__DIR__ === '\\computerName\c$';
__FILE__ === '\\computerName\c$\test.php';

注意:無論執行內容為何,realpath('.') 似乎總是會傳回實際的檔案系統路徑。
4
Sbastien Fauvel
8 年前
請注意在 Traits 中使用 __CLASS__ 和 __METHOD__ 時的一個小不一致之處 (標準 php 7.0.4):雖然 __CLASS__ 的運作方式與宣傳的一樣,並動態傳回 Trait 被使用的類別名稱,但 __METHOD__ 實際上會將 Trait 名稱而不是類別名稱作為前綴!
-1
public at taliesinnuin dot net
4 年前
如果您將 PHP 與 fpm 搭配使用 (現今很常見),請注意 __DIR__ 和 __FILE__ 將會根據 fpm 根目錄傳回值,這可能與它在檔案系統上的實際位置不同。

如果在網頁根目錄中的 php 檔案從自身外部提取 PHP 檔案 (非常常見的情況) 時部署應用程式,這可能會導致暫時的困惑。 您可能會想知道為什麼 __DIR__ 會傳回 "/",而檔案本身卻存在於 /var/www/html 或其他位置。

您可以使用 NGINX 在其 fastcgi 請求中明確新增路徑的必要部分來處理這種情況,然後您可以在 FPM 程序/伺服器/容器上將根目錄設定為網頁根目錄以外的其他內容 (只要沒有其他方法可以公開存取)。

希望這能為將使用 __DIR__ 的程式碼移至 FPM 的人節省五分鐘。
To Top