什么时候使用PHP self::class?什么时候使用__CLASS__?

bkkx9g8r  于 2023-03-07  发布在  PHP
关注(0)|答案(2)|浏览(142)

序言
我正在从事一个支持PHP5.5到PHP8.3的遗留开源项目。

问题

我的问题很简单:
1.什么时候使用PHP self::class
1.何时使用__CLASS__
1.它会随着PHP版本的不同而变化吗?(至少在PHP 5.5之后感兴趣)
注意:你可以跳过其他部分。这只是一个描述为什么我在这里和我尝试了什么。

文件

https://www.php.net/manual/en/language.constants.magic.php
https://www.php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.class
似乎没有提到他们之间的变化。

测试

我试着定义一些测试(请随意提出更多建议):

<?php
/**
 * This is just a test class
 */
class A {
        public function selfclass_normal() {
                return self::class;
        }
        public function constclass_normal() {
                return self::class;
        }
        public static function selfclass_static() {
                return self::class;
        }
        public static function constclass_static() {
             return __CLASS__;
        }
}

class B extends A {}

class C extends A {
        public function selfclass_normal() {
                return self::class;
        }
        public function constclass_normal() {
                return self::class;
        }
        public static function selfclass_static() {
                return self::class;
        }
        public static function constclass_static() {
             return __CLASS__;
        }
}

echo "Normal class:\n";
$a = new A();
echo $a->selfclass_normal();
echo $a->constclass_normal();
echo A::selfclass_static();
echo A::constclass_static();
echo "\n\n";

echo "Empty extended class\n";
$b = new B();
echo $b->selfclass_normal();
echo $b->constclass_normal();
echo B::selfclass_static();
echo B::constclass_static();
echo "\n\n";

echo "Extended class rewriting methods\n";
$c = new C();
echo $c->selfclass_normal();
echo $c->constclass_normal();
echo C::selfclass_static();
echo C::constclass_static();
echo "\n\n";

这是PHP 7.4的输出:

Normal class:
AAAA

Empty extended class
AAAA

Extended class rewriting methods
CCCC

所以我倾向于认为self::class__CLASS__是相同的。

在Rector.php中探索

我发现Rector.php有一个将__CLASS__转换为self::class的规则,而不是相反的规则。
https://github.com/rectorphp/rector/blob/main/docs/rector_rules_overview.md#classconstanttoselfclassrector
看来校长更喜欢self::class
它是否有助于理解self::class__CLASS__之间的历史差异?

8aqjt8rx

8aqjt8rx1#

它会随着PHP版本的不同而变化吗?(至少在PHP 5.5之后感兴趣)
self::class在设计上应该是__CLASS__的替代品,而且更加灵活,不幸的是,如果你还在使用php 5,你可能会遇到一些bug(例如thisthis),但如果你使用的是php 7或更高版本,那就没问题了。

wljmcqd8

wljmcqd82#

__CLASS__只能在类上下文中使用,而::class可以像A::class一样用于任何地方,以获取类的FQN。通常使用::class是为了简化,因为它在任何地方都有效。

相关问题