序言
我正在从事一个支持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__
之间的历史差异?
2条答案
按热度按时间8aqjt8rx1#
它会随着PHP版本的不同而变化吗?(至少在PHP 5.5之后感兴趣)
self::class
在设计上应该是__CLASS__
的替代品,而且更加灵活,不幸的是,如果你还在使用php 5,你可能会遇到一些bug(例如this,this),但如果你使用的是php 7或更高版本,那就没问题了。wljmcqd82#
__CLASS__
只能在类上下文中使用,而::class
可以像A::class
一样用于任何地方,以获取类的FQN。通常使用::class
是为了简化,因为它在任何地方都有效。