PHP中的魔術(shù)常數(shù)根據(jù)源代碼位置而不是運行時上下文解決了編譯時間。 2。在匿名函數(shù)內(nèi)部,函數(shù)返回一個空字符串,因為閉合缺少名稱。 3。功能__,__method__和__ class反映定義閉合的封閉功能,方法或類,而不是閉合本身。 4。列和文件返回文字線號和文件路徑,無論何時呼叫,都寫了閉合的路徑。 5。特質(zhì)將返回特徵的名稱,如果特徵內(nèi)定義了閉合,並且名稱空間在定義點返回當前名稱空間。 6。要獲取諸如呼叫者位置之類的運行時上下文,請使用debug_backtrace()或手動上下文傳遞,因為魔術(shù)常數(shù)無法提供動態(tài)的呼叫信息。因此,魔術(shù)常數(shù)基於其定義站點而不是執(zhí)行上下文可以預見,這使得它們不適合在運行時進行內(nèi)省關(guān)閉。
PHP中的魔術(shù)常數(shù) - 例如__LINE__
, __FILE__
, __FUNCTION__
等。是以可預測的方式表現(xiàn)出來的,但是它們與匿名功能和關(guān)閉的互動有時會使開發(fā)人員感到困惑。讓我們闡明這些魔術(shù)常數(shù)在這種情況下如何工作。
魔術(shù)常數(shù)在編譯時解決
要理解的關(guān)鍵點是,魔術(shù)常數(shù)不是變量- 它們在編譯時而不是在運行時由PHP解決。這意味著它們的值是根據(jù)源代碼出現(xiàn)的位置確定的,而不是執(zhí)行代碼的位置。
例如:
echo __line__; //輸出當前行號
無論該線路運行何處(即使在功能或閉合內(nèi)),它都會輸出文件中寫入的行號。
即使在匿名函數(shù)中,此行為也具有真實性:
$ lambda = function(){ 返回__function__; }; echo $ lambda(); //輸出:“”
為什麼要空字符串?因為__FUNCTION__
匿名函數(shù)內(nèi)部返回當前函數(shù)的名稱。但是匿名功能沒有名稱,因此PHP返回一個空字符串。
每個魔術(shù)在封閉中的表現(xiàn)如何
讓我們?yōu)g覽最常見的魔術(shù)常數(shù),看看它們在封閉中的表現(xiàn)。
__FUNCTION__
- 返回封閉功能名稱
在閉合內(nèi), __FUNCTION__
指的是包含閉合的函數(shù)的名稱,而不是閉合本身。
功能mycontroller(){ $ clocure = function(){ 返回__function__; }; echo $ clipure(); //輸出:“ mycontroller” }
即使該代碼在關(guān)閉內(nèi)部執(zhí)行, __FUNCTION__
解決了定義代碼的位置 - 在這種情況下,在myController
內(nèi)部。
__METHOD__
- 適用相同的規(guī)則
__METHOD__
包括類名稱和方法,但再次反映了代碼中常數(shù)出現(xiàn)的方法。
類用戶{ 公共功能登錄(){ $ clocure = function(){ 返回__Method__; }; echo $ clipure(); //輸出:“用戶::登錄” } }
儘管如此,它不是關(guān)閉方法(因為它沒有),而是封閉方法。
__LINE__
和__FILE__
- 字面源位置
這些是最直接的。他們返回寫入常數(shù)的文件路徑和行號。
$ clocure = function(){ 迴聲“文件:”。 __文件__ 。 “ \ n”; 迴聲“線:”。 __線__ 。 “ \ n”; }; $ CLASURE(); //輸出定義關(guān)閉的實際文件和行號
即使將封閉式傳遞給另一個文件或以後將其調(diào)用,值也不會更改。
__CLASS__
- 與上下文有關(guān)
__CLASS__
行為相似:它返回定義代碼的類的名稱。
班級付款{ 公共功能過程(){ $ clocure = function(){ 返回__ class__; }; echo $ clipure(); //輸出:“付款” } }
但是,如果關(guān)閉在任何類之外定義,它將什麼都沒有返回(或在某些情況下觸發(fā)通知)。
__TRAIT__
和__NAMESPACE__
-
__TRAIT__
:僅在特徵定義內(nèi)有意義。在特徵內(nèi)的封閉中,它返回特徵的名稱。 -
__NAMESPACE__
:在定義點返回當前名稱空間。
實際含義
由於魔術(shù)常數(shù)是編譯時文字,因此您不能使用它們來內(nèi)省封閉本身。例如:
- 您無法通過
__FUNCTION__
封閉的“名稱”。 - 您無法動態(tài)地檢測到封閉的位置 -
__LINE__
將始終顯示其定義的位置。
這可以提高期望運行時上下文的調(diào)試或記錄工具。
運行時上下文的解決方法
如果您需要運行時信息(例如,在調(diào)用關(guān)閉的地方),則需要使用其他方法:
- 使用
debug_backtrace()
檢查呼叫堆棧。 - 手動將上下文傳遞到封閉中。
- 在閉合對像上使用反射(有限)。
例子:
$ clocure = function(){ $ trace = debug_backtrace(debug_backtrace_ignore_args,1); $ caller = $ trace [0]; 返回“從{$ caller ['file']}在line {$ caller ['line']}上調(diào)用的“返回”; };
與__FILE__
/ __LINE__
不同,這為您提供了實際的運行時位置。
概括
- 魔術(shù)常數(shù)根據(jù)源代碼位置在編譯時解決。
- 在關(guān)閉中:
-
__FUNCTION__
,__METHOD__
,__CLASS__
指的是封閉範圍,而不是閉合。 -
__LINE__
,__FILE__
指向閉合的位置。
-
- 匿名函數(shù)沒有名稱,因此
__FUNCTION__
返回一個空字符串。 - 對於運行時上下文,請使用
debug_backtrace()
或手動跟蹤。
基本上,魔術(shù)常數(shù)不夠魔術(shù),無法知道它們在封閉之內(nèi) - 他們只是在解析PHP文件時看到周圍的文字。請記住這一點,他們的行為是完全合理的。
以上是魔術(shù)常數(shù)神秘:匿名功能和關(guān)閉的行為的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

TRAITisamagicconstantinPHPthatalwaysreturnsthenameofthetraitinwhichitisdefined,regardlessoftheclassusingit.1.Itisresolvedatcompiletimewithinthetrait’sscopeanddoesnotchangebasedonthecallingclass.2.UnlikeCLASS__,whichreflectsthecurrentclasscontext,__TR

dirisessential forbuildingReliablephpautoloadersbecapeitProvideStable,絕對epathtothtothecurrentfile'sdirectory,可確保ConsistentBehaviorActractRospDifferentenVerentenments.1.unlikeLikeLikeLikeLikeLikeLikeLativePathSorgatSorgetCwd(),Diriscontext-Expontext-Indeptertentententententententententertentertentertriprip,disternepertriper,ingingfailfip

DIR和FILE是PHP中的魔術(shù)常量,能有效解決相對路徑在復雜項目中導致的文件包含錯誤。 1.FILE返回當前文件的完整路徑,__DIR__返回其所在目錄;2.使用DIR可確保include或require總是相對於當前文件執(zhí)行,避免因調(diào)用腳本不同而導致路徑錯誤;3.可用於可靠包含文件,如require_onceDIR.'/../config.php';4.在入口文件中定義BASE_DIR常量以統(tǒng)一項目路徑管理;5.安全加載配置文件,如$config=requireDIR.'/config/dat

theSostEffectiveDebuggingTrickinc/c Isusing the-inmacros__file __,__行__和__function__togetPreciseErrorContext.1 .__ file __ file __providestHecurrentsourcefile'spathasastring.2 .__ line__ line__ line__givestHecurrentLineNumberenneNumberennumberennumberennumber.___________________________3

使用__DIR__可以解決PHP應用中的路徑問題,因為它提供當前文件所在目錄的絕對路徑,避免相對路徑在不同執(zhí)行上下文下的不一致。 1.DIR__始終返回當前文件的目錄絕對路徑,確保包含文件時路徑準確;2.使用__DIR.'/../config.php'等方式可實現(xiàn)可靠文件引用,不受調(diào)用方式影響;3.在入口文件中定義APP_ROOT、CONFIG_PATH等常量,提昇路徑管理的可維護性;4.將__DIR__用於自動加載和模塊註冊,保證類和服務路徑正確;5.避免依賴$_SERVER['DOCUMENT

CLASS__,__METHOD__,and__NAMESPACEarePHPmagicconstantsthatprovidecontextualinformationformetaprogramming.1.CLASSreturnsthefullyqualifiedclassname.2.METHODreturnstheclassandmethodnamewithnamespace.3.NAMESPACEreturnsthecurrentnamespacestring.Theyareused

Contextualmagicconstantsarenamed,meaningfulidentifiersthatprovideclearcontextinerrorlogs,suchasUSER_LOGIN_ATTEMPTorPAYMENT_PROCESSING.2.Theyimprovedebuggingbyreplacingvagueerrormessageswithspecific,searchablecontext,enablingfasterrootcauseidentificat

在trait-based架構(gòu)中,魔法常量並非反模式,而是可作為有意設(shè)計的編譯時標記或優(yōu)化提示。 1.魔法常量可用作版本開關(guān),如通過constVERSION:u8區(qū)分序列化行為,使下游代碼依據(jù)版本條件編譯;2.可作為標籤優(yōu)化動態(tài)派發(fā),如為trait實現(xiàn)分配唯一TAG常量,實現(xiàn)快速路徑匹配並可能被編譯器內(nèi)聯(lián)消除;3.可替代RTTI提供輕量級類型區(qū)分,如通過編譯時哈希生成類型指紋,避免運行時類型信息開銷;4.使用時需避免真正“魔法”,應統(tǒng)一定義、充分文檔化,並優(yōu)先使用枚舉或位標誌增強可讀性,如用enum
