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