PHP魔術常量
PHP 向它運行的任何腳本提供了大量的預定義常量。
不過很多常量都是由不同的擴展庫定義的,只有在加載了這些擴展庫時才會出現(xiàn),或者動態(tài)加載后,或者在編譯時已經(jīng)包括進去了。
有八個魔術常量它們的值隨著它們在代碼中的位置改變而改變。
??__LINE__?:當前行號,返回這個常量所在的行號。
??__FILE__?:當前文件的完整路徑和文件名。
??__DIR__?:當前文件所在的目錄。
??__FUNCTION__?:當前函數(shù)的名稱。
??__CLASS__?:當前類的名稱。
??__TRAIT__?:當前 trait 的名稱。
??__METHOD__?:當前方法的名稱(包括類名)。
??__NAMESPACE__?:當前命名空間的名稱。
詳細介紹和舉例
當然,讓我們逐個詳細解釋和舉例這八個 PHP 魔術常量:
-
__LINE__
:__LINE__
常量返回當前行號,即它所在的代碼行在源文件中的行號。這對于調(diào)試和記錄錯誤非常有用。示例:
echo "當前行號:" . __LINE__;
輸出:
當前行號:3
-
__FILE__
:__FILE__
常量返回當前文件的完整路徑和文件名。它可用于獲取正在執(zhí)行的腳本的文件名。示例:
echo "當前文件:" . __FILE__;
輸出:
當前文件:/path/to/your/file.php
-
__DIR__
:__DIR__
常量返回當前文件所在的目錄的完整路徑。示例:
echo "當前目錄:" . __DIR__;
輸出:
當前目錄:/path/to/your/directory
-
__FUNCTION__
:__FUNCTION__
常量返回當前函數(shù)的名稱。這對于記錄日志和調(diào)試時非常有用。示例:
function myFunction() { echo "當前函數(shù):" . __FUNCTION__; } myFunction();
輸出:
當前函數(shù):myFunction
-
__CLASS__
:__CLASS__
常量返回當前類的名稱。如果在類的方法中調(diào)用,它將返回該方法所屬的類的名稱。示例:
class MyClass { public function showClassName() { echo "當前類:" . __CLASS__; } } $obj = new MyClass(); $obj->showClassName();
輸出:
當前類:MyClass
-
__TRAIT__
:__TRAIT__
常量返回當前 trait 的名稱。如果在 trait 方法中調(diào)用,它將返回該方法所屬的 trait 的名稱。示例:
trait MyTrait { public function showTraitName() { echo "當前 trait:" . __TRAIT__; } } class MyClass { use MyTrait; } $obj = new MyClass(); $obj->showTraitName();
輸出:
當前 trait:MyTrait
-
__METHOD__
:__METHOD__
常量返回當前方法(包括類名)的名稱。在類的方法中調(diào)用時,它將返回類名和方法名的組合。示例:
class MyClass { public function showMethodName() { echo "當前方法:" . __METHOD__; } } $obj = new MyClass(); $obj->showMethodName();
輸出:
當前方法:MyClass::showMethodName
-
__NAMESPACE__
:__NAMESPACE__
常量返回當前命名空間的名稱。示例:
namespace MyNamespace; echo "當前命名空間:" . __NAMESPACE__;
輸出:
當前命名空間:MyNamespace
這些魔術常量在不同的上下文中提供了關于當前執(zhí)行環(huán)境的重要信息,可用于調(diào)試、日志記錄和動態(tài)代碼生成等情景。
PHP 命名空間(namespace)
PHP 命名空間(namespace)是在 PHP 5.3 中加入的,目的是解決重名問題,PHP中不允許兩個函數(shù)或者類出現(xiàn)相同的名字,否則會產(chǎn)生一個致命的錯誤。
PHP 命名空間可以解決以下兩類問題:
- 用戶編寫的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突。
- 為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創(chuàng)建一個別名(或簡短)的名稱,提高源代碼的可讀性。
定義命名空間
在 PHP 中,命名空間被用來解決代碼命名沖突的問題,它能夠?qū)㈩?、函?shù)、常量等封裝在命名空間中,防止不同代碼庫中的同名標識符之間發(fā)生沖突。讓我詳細解釋如何定義命名空間以及提供一個示例。
定義命名空間的基本語法:
在 PHP 中,我們使用 namespace
關鍵字來定義命名空間。命名空間應該出現(xiàn)在所有非 PHP 代碼之前,包括 declare
、use
、require
或 include
語句。下面是定義命名空間的基本語法:
namespace MyNamespace;
// 這里是命名空間內(nèi)的代碼
在這個語法中:
-
MyNamespace
是命名空間的名稱,您可以根據(jù)需要自定義命名空間的名稱。
示例:
讓我們看一個簡單的示例來演示如何定義命名空間并使用命名空間內(nèi)的類。
// 文件:MyClass.php
namespace MyNamespace;
class MyClass {
public function sayHello() {
echo "Hello from MyClass!";
}
}
// 文件:index.php
require "MyClass.php"; // 引入定義了命名空間的文件
$obj = new MyNamespace\MyClass(); // 使用完整的命名空間路徑實例化類
$obj->sayHello();
在這個例子中,我們通過 namespace MyNamespace;
定義了命名空間 MyNamespace
,然后在另一個文件中通過 require
引入了定義了命名空間的文件,并實例化了命名空間內(nèi)的類。
通過使用命名空間,我們可以有效地組織和管理 PHP 代碼,避免了命名沖突,并提高了代碼的可維護性和可重用性。
子命名空間
子命名空間是指在一個已經(jīng)存在的父命名空間下創(chuàng)建的額外命名空間。子命名空間的作用類似于文件系統(tǒng)中的文件夾結(jié)構(gòu),可以更好地組織和管理代碼。讓我詳細解釋一下,并給出一個示例。
在 PHP 中,可以使用 namespace
關鍵字定義子命名空間。子命名空間的定義方式與父命名空間類似,只需在父命名空間后面加上反斜杠 \
,然后跟上子命名空間的名稱。下面是定義子命名空間的基本語法:
namespace ParentNamespace\SubNamespace;
// 這里是子命名空間內(nèi)的代碼
在這個語法中:
-
ParentNamespace
是父命名空間的名稱。 -
SubNamespace
是子命名空間的名稱。
示例:
讓我們通過一個示例來演示如何定義和使用子命名空間。
假設我們有一個父命名空間 MyNamespace
,現(xiàn)在我們要在這個命名空間下創(chuàng)建一個子命名空間 SubNamespace
,并在子命名空間中定義一個類 SubClass
。
// 文件:MyNamespace/SubNamespace/SubClass.php
namespace MyNamespace\SubNamespace;
class SubClass {
public function sayHello() {
echo "Hello from SubClass!";
}
}
現(xiàn)在,在另一個文件中我們可以使用這個子命名空間中的類:
// 文件:index.php
require "MyNamespace/SubNamespace/SubClass.php"; // 引入定義了子命名空間的文件
$obj = new MyNamespace\SubNamespace\SubClass(); // 使用完整的命名空間路徑實例化子命名空間中的類
$obj->sayHello();
在這個示例中,我們成功地定義了子命名空間 SubNamespace
,并在其中定義了一個類 SubClass
。然后在另一個文件中通過引入子命名空間的文件,并使用完整的命名空間路徑實例化了 SubClass
類。
子命名空間的使用可以更好地組織和管理代碼,使代碼結(jié)構(gòu)更加清晰易懂。
使用命名空間
使用命名空間可以幫助您組織和管理 PHP 代碼,避免命名沖突,并提高代碼的可維護性和可重用性。下面是一些關于如何使用命名空間的基本方法:
- 聲明命名空間
在您的 PHP 文件的最開始位置使用 namespace
關鍵字來聲明命名空間。例如:
namespace MyNamespace;
class MyClass {
// 類的定義
}
function myFunction() {
// 函數(shù)的定義
}
在這個例子中,我們聲明了命名空間 MyNamespace
并定義了一個類和一個函數(shù)。
- 引入命名空間
要在另一個文件中使用命名空間中的類或函數(shù),可以使用 use
關鍵字將命名空間引入當前的作用域。例如:
use MyNamespace\MyClass;
use function MyNamespace\myFunction;
$obj = new MyClass(); // 實例化命名空間中的類
myFunction(); // 調(diào)用命名空間中的函數(shù)
- 完整的命名空間路徑
如果不使用 use
引入命名空間,還可以通過完整的命名空間路徑來訪問命名空間中的類或函數(shù)。例如:
$obj = new MyNamespace\MyClass(); // 使用完整的命名空間路徑實例化類
MyNamespace\myFunction(); // 使用完整的命名空間路徑調(diào)用函數(shù)
- 命名空間的使用
如果需要在父命名空間下創(chuàng)建子命名空間,可以按照前面提到的方法進行定義和使用。
示例:
// 定義命名空間和類
namespace MyNamespace;
class MyClass {
public function sayHello() {
echo "Hello from MyNamespace!";
}
}
// 在另一個文件中使用命名空間中的類
require "MyClass.php"; // 引入定義了命名空間的文件
use MyNamespace\MyClass;
$obj = new MyClass(); // 實例化命名空間中的類
$obj->sayHello(); // 調(diào)用類中的方法
在這個示例中,我們定義了一個命名空間 MyNamespace
,在另一個文件中使用了 use
關鍵字引入了命名空間中的類,并成功地實例化了這個類并調(diào)用了其中的方法。
命名空間和動態(tài)語言特征
PHP 命名空間的實現(xiàn)受到其語言自身的動態(tài)特征的影響。因此,如果要將下面的代碼轉(zhuǎn)換到命名空間中,動態(tài)訪問元素。
example1.php 文件代碼:
<?php
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "global";
$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
?>
必須使用完全限定名稱(包括命名空間前綴的類名稱)。注意因為在動態(tài)的類名稱、函數(shù)名稱或常量名稱中,限定名稱和完全限定名稱沒有區(qū)別,因此其前導的反斜杠是不必要的。
動態(tài)訪問命名空間的元素
<?php
namespace namespacename;
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "namespaced";
include 'example1.php';
$a = 'classname';
$obj = new $a; // 輸出 classname::__construct
$b = 'funcname';
$b(); // 輸出函數(shù)名
echo constant('constname'), "\n"; // 輸出 global
/* 如果使用雙引號,使用方法為 "\\namespacename\\classname"*/
$a = '\namespacename\classname';
$obj = new $a; // 輸出 namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // 輸出 namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // 輸出 namespacename\funcname
$b = '\namespacename\funcname';
$b(); // 輸出 namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // 輸出 namespaced
echo constant('namespacename\constname'), "\n"; // 輸出 namespaced
?>
namespace關鍵字和__NAMESPACE__常量
namespace
關鍵字和 __NAMESPACE__
常量是 PHP 中用于處理命名空間的重要工具。下面我將詳細解釋它們,并通過示例來說明它們的用法。
-
namespace
關鍵字:
namespace
關鍵字用于定義當前文件中類、函數(shù)或常量所屬的命名空間。在同一個文件中,namespace
關鍵字必須在所有代碼之前聲明。
語法:
<?php
namespace MyNamespace;
class MyClass {
// 類實現(xiàn)
}
function myFunction() {
// 函數(shù)實現(xiàn)
}
?>
-
__NAMESPACE__
常量:
__NAMESPACE__
是一個魔術常量,用于返回當前命名空間的名稱。它在任何地方都可使用,即使在沒有明確指定命名空間的地方也可以使用。
示例:
<?php
// 文件: MyNamespace/MyClass.php
namespace MyNamespace;
class MyClass {
public function getNamespace() {
return __NAMESPACE__;
}
}
?>
<?php
// 文件: index.php
require "MyNamespace/MyClass.php";
$obj = new MyNamespace\MyClass();
echo $obj->getNamespace(); // 輸出:MyNamespace
?>
在這個示例中,我們定義了一個命名空間 MyNamespace
,并在類中使用了 __NAMESPACE__
常量來獲取當前命名空間的名稱。然后在另一個文件中實例化該類,并輸出當前命名空間的名稱。
通過使用 namespace
關鍵字和 __NAMESPACE__
常量,可以更好地組織和管理代碼,避免命名沖突,并了解當前代碼所在的命名空間。
使用命名空間:別名/導入
PHP中使用命名空間的別名和導入功能可以幫助簡化代碼,提高可讀性。下面我將解釋如何使用命名空間的別名(Aliases)和導入(Imports)功能,并提供示例說明:
- 使用別名(Aliases):
在 PHP 中,您可以為一個較長或復雜的命名空間路徑創(chuàng)建一個短的別名,以便在代碼中更方便地引用這個命名空間。這里簡單介紹一下如何使用別名:
語法:
use Namespace\Long\ClassName as Alias;
示例:
use MyNamespace\SubNamespace\AnotherClass as AnotherAlias;
$object = new AnotherAlias(); // 創(chuàng)建一個命名空間的別名對象實例
- 使用導入(Imports):
通過導入命名空間,您可以在當前作用域中引入多個類、函數(shù)或常量,而無需重復使用完整的命名空間路徑。下面簡單介紹如何使用導入:
語法:
use Namespace\ClassA;
use Namespace\ClassB;
示例:
use MyNamespace\SubNamespace\SomeClass;
use MyApp\Helpers\HelperFunctions;
$obj1 = new SomeClass(); // 直接使用導入的類
HelperFunctions::someFunction(); // 直接訪問導入的函數(shù)
完整示例:
<?php
// 定義命名空間及類
namespace MyNamespace\Utilities;
class Logger {
public function log($message) {
echo "Logging: $message";
}
}
// 在另一個文件中導入和使用
require "Logger.php";
use MyNamespace\Utilities\Logger as MyLogger; // 為 Logger 類創(chuàng)建別名 MyLogger
$log = new MyLogger();
$log->log("An important message"); // 使用別名創(chuàng)建的實例調(diào)用方法
?>
在這個示例中,我們定義了一個命名空間 MyNamespace\Utilities
,在另一個文件中通過導入并為 Logger
類創(chuàng)建了別名 MyLogger
,然后實例化該類并調(diào)用其中的方法。
使用命名空間:后備全局函數(shù)/常量
在PHP中,可以通過命名空間的后備全局函數(shù)和常量來實現(xiàn)在命名空間內(nèi)找不到函數(shù)或常量時,自動回退到全局命名空間中查找。這樣可以確保即使在特定命名空間內(nèi)沒有定義某個函數(shù)或常量,程序仍能正常運行。
后備全局函數(shù):
使用 namespace
關鍵字前添加反斜杠 \
可以在命名空間中找不到函數(shù)時,自動回退到全局空間尋找該函數(shù)。
示例:
namespace MyNamespace;
function myFunction() {
// 函數(shù)實現(xiàn)
}
\myFunction(); // 如果在當前命名空間找不到 myFunction,則自動回退到全局空間查找
后備全局常量:
類似地,通過在命名空間中找不到常量時,在常量名前加上反斜杠 \
可以在全局空間中查找該常量。
示例:
namespace MyNamespace;
define("MY_CONSTANT", "Some value");
echo \MY_CONSTANT; // 如果在當前命名空間找不到 MY_CONSTANT 常量,則自動回退到全局空間查找
這樣,無論是函數(shù)還是常量,當在特定命名空間內(nèi)找不到時,PHP會自動在全局空間中查找。這種機制確保了代碼的靈活性并簡化了命名空間的使用。
全局空間
如果沒有定義任何命名空間,所有的類與函數(shù)的定義都是在全局空間,與 PHP 引入命名空間概念前一樣。在名稱前加上前綴 \ 表示該名稱是全局空間中的名稱,即使該名稱位于其它的命名空間中時也是如此。
使用全局空間說明
<?php
namespace A\B\C;
/* 這個函數(shù)是 A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // 調(diào)用全局的fopen函數(shù)
return $f;
}
?>
命名空間的順序
自從有了命名空間之后,最容易出錯的該是使用類的時候,這個類的尋找路徑是什么樣的了。
<?php
namespace A;
use B\D, C\E as F;
// 函數(shù)調(diào)用
foo(); // 首先嘗試調(diào)用定義在命名空間"A"中的函數(shù)foo()
// 再嘗試調(diào)用全局函數(shù) "foo"
\foo(); // 調(diào)用全局空間函數(shù) "foo"
my\foo(); // 調(diào)用定義在命名空間"A\my"中函數(shù) "foo"
F(); // 首先嘗試調(diào)用定義在命名空間"A"中的函數(shù) "F"
// 再嘗試調(diào)用全局函數(shù) "F"
// 類引用
new B(); // 創(chuàng)建命名空間 "A" 中定義的類 "B" 的一個對象
// 如果未找到,則嘗試自動裝載類 "A\B"
new D(); // 使用導入規(guī)則,創(chuàng)建命名空間 "B" 中定義的類 "D" 的一個對象
// 如果未找到,則嘗試自動裝載類 "B\D"
new F(); // 使用導入規(guī)則,創(chuàng)建命名空間 "C" 中定義的類 "E" 的一個對象
// 如果未找到,則嘗試自動裝載類 "C\E"
new \B(); // 創(chuàng)建定義在全局空間中的類 "B" 的一個對象
// 如果未發(fā)現(xiàn),則嘗試自動裝載類 "B"
new \D(); // 創(chuàng)建定義在全局空間中的類 "D" 的一個對象
// 如果未發(fā)現(xiàn),則嘗試自動裝載類 "D"
new \F(); // 創(chuàng)建定義在全局空間中的類 "F" 的一個對象
// 如果未發(fā)現(xiàn),則嘗試自動裝載類 "F"
// 調(diào)用另一個命名空間中的靜態(tài)方法或命名空間函數(shù)
B\foo(); // 調(diào)用命名空間 "A\B" 中函數(shù) "foo"
B::foo(); // 調(diào)用命名空間 "A" 中定義的類 "B" 的 "foo" 方法
// 如果未找到類 "A\B" ,則嘗試自動裝載類 "A\B"
D::foo(); // 使用導入規(guī)則,調(diào)用命名空間 "B" 中定義的類 "D" 的 "foo" 方法
// 如果類 "B\D" 未找到,則嘗試自動裝載類 "B\D"
\B\foo(); // 調(diào)用命名空間 "B" 中的函數(shù) "foo"
\B::foo(); // 調(diào)用全局空間中的類 "B" 的 "foo" 方法
// 如果類 "B" 未找到,則嘗試自動裝載類 "B"
// 當前命名空間中的靜態(tài)方法或函數(shù)
A\B::foo(); // 調(diào)用命名空間 "A\A" 中定義的類 "B" 的 "foo" 方法
// 如果類 "A\A\B" 未找到,則嘗試自動裝載類 "A\A\B"
\A\B::foo(); // 調(diào)用命名空間 "A" 中定義的類 "B" 的 "foo" 方法
// 如果類 "A\B" 未找到,則嘗試自動裝載類 "A\B"
?>
關注我,不迷路,共學習,同進步
關注我,不迷路,共學習,同進步文章來源:http://www.zghlxwxcb.cn/news/detail-850846.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-850846.html
到了這里,關于12 Php學習:魔術常量的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!