我终于发现自己在学习范围和上下文,以及它们之间的区别,但现在我遇到了问题。
我在子类继承的父类中有一个静态方法。当我从孩子调用该方法时,我希望能够在父母中告诉哪个孩子调用了它。
后期静态绑定,对吧?凉爽的。像这样:
class Daddy {
public static function madSkillz() {
var_dump( static::class );
}
}
class Sonny extends Daddy {}
Sonny::madSkillz();
在输出中,我看到:
string(5) "Sonny"
万岁,正是我所希望的!但是...现在假设我从该父静态方法中调用了一个函数。我可以用它debug_backtrace
来找出调用了静态方法,但不幸的是我看到的是声明类,而不是作用域。
function GoToTheFair() {
var_dump( debug_backtrace() );
}
class Daddy {
public static function madSkillz() {
var_dump( static::class );
GoToTheFair();
}
}
class Sonny extends Daddy {}
Sonny::madSkillz();
这将打印输出:
string(5) "Sonny"
array(2) {
[0]=>
array(4) {
["file"]=>
string(28) "/home/branja/Desktop/cry.php"
["line"]=>
int(10)
["function"]=>
string(11) "GoToTheFair"
["args"]=>
array(0) {
}
}
[1]=>
array(6) {
["file"]=>
string(28) "/home/branja/Desktop/cry.php"
["line"]=>
int(16)
["function"]=>
string(9) "madSkillz"
["class"]=>
string(5) "Daddy"
["type"]=>
string(2) "::"
["args"]=>
array(0) {
}
}
}
我希望能够在其中创建一个ReflectionMethod
对象GoToTheFair()
并调用其他方法,但我需要确保我使用的是正确的范围,应该是Sonny
,而不是Daddy
.
有没有办法在不作为static::class
参数传递的情况下做到这一点GoToTheFair()
?
编辑:我不想使用参数方法的原因是该GoToTheFair()
函数是我正在编码的库和类Daddy
,并且Sonny
是用户的。我不希望他们有选择自己范围的自由。