💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
https://ashallendesign.co.uk/blog/php-magic-constants PHP提供了9个魔术常数,您可以在PHP应用程序代码中使用。 它们是“神奇的”,因为它们是在编译时定义的,不像常规常量(您可以自己定义)是在运行时定义的。这意味着它们的值可以根据它们在代码中的使用位置而更改。 ## __FUNCTION__ `__FUNCTION__`魔术常量返回使用它的函数的名称。如果在函数或方法之外使用它,它将返回空字符串。 ### 在函数中使用`__FUNCTION__` 假设你有一个名为`myFunction`的函数: ``` function myFunction() { echo __FUNCTION__; } ``` 调用上面的函数将输出:`myFunction`。 ### 在类方法中使用`__FUNCTION__` 假设你有一个类,它有一个名为`myMethod`的方法: ``` class MyClass { public function myMethod() { echo __FUNCTION__; } } ``` 调用`myMethod`方法将输出:`myMethod`。 ### 在匿名函数中使用`__FUNCTION__` 假设你有一个匿名函数: ``` $myFunction = function () { echo __FUNCTION__; }; ``` 调用`$myFunction`变量将输出:`{closure}`。 ## `__METHOD__` `__METHOD__`魔术常量返回使用它的方法的名称和编写它的类。如果在函数或方法之外使用它,它将返回空字符串。 ### 在类方法中使用`__METHOD__` 假设您有一个`App\Utilities\MyClass`类,其方法名为`myMethod`: ``` namespace App\Utilities; class MyClass { public function myMethod() { echo __METHOD__; } } ``` 调用`myMethod`方法将输出:`App\Utilities\MyClass::myMethod`。 ### 在父类方法中使用`__METHOD__` 常量返回常量所在的类和方法名。这意味着如果你在父类中使用`__METHOD__`,任何子类都将使用父类的名称。 例如,假设你有一个名为`App\Utilities\ParentClass`的父类: ``` namespace App\Utilities; class ParentClass { public function myMethod() { echo __METHOD__; } } ``` 你有一个名为`App\Utilities\ChildClass`的子类,它扩展了`App\Utilities\ParentClass`类: ``` namespace App\Utilities; class ChildClass extends ParentClass { // ... } ``` 调用`(new ChildClass())->myMethod()`方法将输出:`App\Utilities\ParentClass::myMethod`。 ### 在函数中使用`__METHOD__` 如果你在一个函数中调用`__METHOD__`,输出将与`__FUNCTION__`相同。所以它只会输出函数的名称。 类似地,如果你在一个匿名函数中调用`__METHOD__`,输出将与`__FUNCTION__`相同。所以它只会输出`{closure}`。 ## `__CLASS__` `__CLASS__`魔术常量返回使用它的类的名称。如果在类外使用它,它将返回一个空字符串。 ### 在类方法中使用`__CLASS__` 假设你有以下代码: ``` namespace App\Utilities; class MyClass { public function myMethod() { echo __CLASS__; } } ``` 调用`myMethod`方法将输出:`MyClass`。 ### 在父类中使用`__CLASS__` 与`__METHOD__`魔术常量类似,`__CLASS__`常量将返回写入它的类的名称。这意味着如果你在父类中使用`__CLASS__`,那么父类的名字将被使用,而不是子类的名字。 例如,假设你有一个名为`App\Utilities\ParentClass`的父类: ``` namespace App\Utilities; class ParentClass { public function myMethod() { echo __CLASS__; } } ``` 你有一个名为`App\Utilities\ChildClass`的子类,它扩展了`App\Utilities\ParentClass`类: ``` namespace App\Utilities; class ChildClass extends ParentClass { // ... } ``` 调用`(new ChildClass())->myMethod()`方法将输出:`App\Utilities\ParentClass`。 ### 在Trait中使用`__CLASS__` 如果在trait中使用了`__CLASS__`常量,它将返回使用trait的类的名称。 例如,假设你有一个名为`MyTrait`的trait: ``` namespace App\Utilities; trait MyTrait { public function myMethod() { echo __CLASS__; } } ``` 你有一个名为`MyClass`的类,它使用了`MyTrait`trait: ``` namespace App\Utilities; class MyClass { use MyTrait; } ``` 调用`(new MyClass())->myMethod()`方法将输出:`App\Utilities\MyClass`。 ## ::class `::class`魔术常量返回类的完全限定类名。 这是我发现自己使用最多的魔法常数,特别是在Laravel应用程序中。当您使用字符串形式的类名时,它特别有用。 假设你有下面的类,`App\Utilities\MyClass`: ``` namespace App\Utilities; class MyClass { // ... } ``` 调用`App\Utilities\MyClass::class`将输出:`App\Utilities\MyClass`。 ### 在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 function myMethod() { echo __TRAIT__; } } ``` 我们有一个使用`MyTrait`trait的类: ``` namespace App\Utilities; class MyClass { use MyTrait; } ``` 调用`(new MyClass())->myMethod()`方法将输出:`App\Utilities\MyTrait`。 ## __NAMESPACE__ `__NAMESPACE__`魔术常量返回当前使用它的命名空间。如果文件不在命名空间中,它将返回空字符串。 例如,假设我们有以下代码: ``` namespace App\Utilities; echo __NAMESPACE__; ``` 运行上面的代码会输出:`App\Utilities`。 与`__METHOD__`和`__CLASS__`魔术常量类似,`__NAMESPACE__`常量将返回写入它的文件的名称空间。 例如,假设你有一个名为`App\Utilities\ParentClass`的父类: ``` namespace App\Utilities; class ParentClass { public function myMethod() { echo __NAMESPACE__; } } ``` 你有一个名为`App\Utilities\Child\ChildClass`的子类,它扩展了`App\Utilities\ParentClass`类: ``` namespace App\Utilities\Child; class ChildClass extends ParentClass { // ... } ``` 运行`(new ChildClass())->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__`相同的值。