PHP 中的: : 类是什么?

PHP 中的 ::class符号是什么?

由于语法的特性,Google 快速搜索不会返回任何内容。

冒号类

使用这个符号有什么好处?

protected $commands = [
\App\Console\Commands\Inspire::class,
];
51003 次浏览

class是特殊的,它由 php 提供,用于获得完全限定的类名。

参见 http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name

<?php


class foo {
const test = 'foobar!';
}


echo foo::test; // print foobar!

SomeClass::class将返回包括名称空间在内的完全限定名 SomeClass

文件: http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name

它非常有用,原因有二。

  • 你不必再用字符串存储你的类名了。因此,许多 IDE 可以在重构代码时检索这些类名
  • 您可以使用 use关键字来解析类,并且不需要编写完整的类名。

例如:

use \App\Console\Commands\Inspire;


//...


protected $commands = [
Inspire::class, // Equivalent to "App\Console\Commands\Inspire"
];

更新 :

这个特性对于 后期静态绑定 也很有用。

您可以使用 static::class特性来获取父类中派生类的名称,而不是使用 __CLASS__神奇常量。例如:

class A {


public function getClassName(){
return __CLASS__;
}


public function getRealClassName() {
return static::class;
}
}


class B extends A {}


$a = new A;
$b = new B;


echo $a->getClassName();      // A
echo $a->getRealClassName();  // A
echo $b->getClassName();      // A
echo $b->getRealClassName();  // B

请注意使用以下内容:

if ($whatever instanceof static::class) {...}

这将抛出一个语法错误:

unexpected 'class' (T_CLASS), expecting variable (T_VARIABLE) or '$'

但是你可以这样做:

if ($whatever instanceof static) {...}

或者

$class = static::class;
if ($whatever instanceof $class) {...}

如果你好奇它属于哪一类(是否是一种语言结构,等等) ,

只是个 不变

PHP 称之为“特殊常量”,它之所以特殊是因为它是由 PHP 在编译时提供的。

特殊的: : class 常量从 PHP 5.5.0开始就可用,并且允许 对于编译时的完全限定类名解析,这是 对命名空间类很有用:

Https://www.php.net/manual/en/language.oop5.constants.php