PHP中的:: class是什么?


102

::classPHP 的表示法是什么?

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

结肠结肠类

使用此表示法的好处是什么?

protected $commands = [
    \App\Console\Commands\Inspire::class,
];

Answers:


87

此功能已在PHP 5.5中实现。

文档: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"
];

更新

此功能对于后期静态绑定也很有用。

__CLASS__您可以使用static::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

1
稍作修正:在第一个示例中,Inspire::class等效于“ App \ Console \ Commands \ Inspire”,但没有反斜杠前缀。
杰森

1
@FabienHaddadi:注意这两个符号use \App\...use App\...允许。我用它来使包含在子命名空间中的类和包含在当前命名空间层次结构之外的类之间的区别。
alphayax

提示一下,您可以键入任何内容,但仍会获得“类”名称。我可以键入SomeDumbCrapThatDoesntExist :: class,如果IDE没有捕获到它,它不会给我错误或警告。容易打错而错过。
加布里埃尔·阿拉克

19

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!

Laravel决定改用它是有原因的吗?
亚达(Yada)

7
在Inspire类上,它不是一个常数。这是php提供的常数。这是获取完全合格的类名称的快速方法。php.net/manual/en/…– jfadich 2015
6

1
@Yada我相信Laravel使用它的原因是它使您少打错字。您可以使用字符串'\ App \ Console \ Commands \ Inspire'或Inspire :: class来获得相同的结果,但是您的IDE将捕获后者的语法/拼写错误,从而使其调试起来更加容易。
jfadich


0

请注意使用以下内容:

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 5. *。其工作原理$className = 'SomeCLass'; $className = new $className(); $methodName = 'someMethod'; $className->$methodName($arg1, $arg2, $arg3); /* or if args can be random array*/ call_user_func_array([$className, $methodName], $arg);
Vladimir Ch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.