当前位置: 欣欣网 > 码农

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