【问题标题】:What is ::class in PHP?PHP 中的 ::class 是什么?
【发布时间】:2015-08-26 12:29:23
【问题描述】:

PHP 中的::class 表示法是什么?

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

冒号冒号类

使用这种表示法有什么好处?

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

【问题讨论】:

    标签: php class laravel


    【解决方案1】:

    SomeClass::class 将返回 SomeClass 的完全限定名称,包括命名空间。此功能在 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"
    ];
    

    更新

    此功能对 Late Static Binding 也很有用。

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

    【讨论】:

    • 稍微更正:在第一个示例中,Inspire::class 等同于“App\Console\Commands\Inspire”,没有反斜杠前缀。
    • @FabienHaddadi :注意use \App\...use App\... 这两个符号是允许的。我用它来区分包含在子命名空间中的类和包含在当前命名空间层次结构之外的类。
    • 一个警告,你可以输入任何东西,仍然得到一个“类”的名字。我可以键入 SomeDumbCrapThatDoesntExist::class,如果 IDE 没有捕获它,它不会给我错误或警告。很容易打错字而错过它。
    【解决方案2】:

    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 决定改用它有什么原因吗?
    • 它不是 Inspire 类的常量。它是 php 提供的常量。这是获取完全限定类名的快速方法。 php.net/manual/en/…
    • @Yada 我相信 Laravel 使用它的原因是它让你少了一个打错字的地方。您可以使用字符串 '\App\Console\Commands\Inspire' 或 Inspire::class 来获得相同的结果,但您的 IDE 会捕获后者的语法/拼写错误,从而使其更易于调试。
    • 这段代码和问题有什么关系?
    【解决方案3】:

    如果您好奇它属于哪个类别(是否是语言构造等),

    这只是一个常数

    PHP 称它为“特殊常量”。它的特殊之处在于它是 PHP 在编译时提供的。

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

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

    【讨论】:

      【解决方案4】:

      请注意使用以下内容:

      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) {...}
      

      【讨论】:

      • 这个用于动态命名的 hack,来自 php 5.* 的工作方式类似于 $className = 'SomeCLass'; $className = new $className(); $methodName = 'someMethod'; $className-&gt;$methodName($arg1, $arg2, $arg3); /* or if args can be random array*/ call_user_func_array([$className, $methodName], $arg);
      猜你喜欢
      • 2018-11-30
      • 2015-12-03
      • 2012-03-04
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多