在运行时而不是在编译时绑定的 __CLASS__ 版本

Posted

技术标签:

【中文标题】在运行时而不是在编译时绑定的 __CLASS__ 版本【英文标题】:Version of __CLASS__ that binds at run-time rather than at compile-time 【发布时间】:2015-04-08 16:35:05 【问题描述】:

在下面的 php 代码中,我想用函数 __X__()(或类似的东西)替换 Foo 类中的 __CLASS__ 魔术常量,这样当从实例 @ 调用方法 hello()Bar 类的 987654325@,它打印 hello from Bar(而不是 hello from Foo)。我想这样做 不覆盖 hello() 内的 Bar

所以基本上,我想要一个在运行时而不是在编译时动态绑定的__CLASS__ 版本。

class Foo 

  public function hello() 

    echo "hello from " . __CLASS__ . "\n";

  



class Bar extends Foo 

  public function world() 

    echo "world from " . __CLASS__ . "\n";

  



$bar = new Bar();
$bar->hello();
$bar->world();

输出:

hello from Foo
world from Bar

我想要这个输出(不覆盖 hello() 内的 Bar):

hello from Bar
world from Bar

【问题讨论】:

【参考方案1】:

你可以简单地使用get_class(),像这样:

echo "hello from " . get_class($this) . "\n";
echo "world from " . get_class($this) . "\n";

输出:

hello from Bar
world from Bar

【讨论】:

以上是关于在运行时而不是在编译时绑定的 __CLASS__ 版本的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE_坚持读源码_Class对象_Java1.7

“_OBJC_CLASS_$_CATransaction,引用自:”编译时错误是啥意思?

PHP的类自动加载机制

Python实例属性限制(__slots__)

Java千百问_05面向对象(014)_如何获取范型的类Class

1.3. __slots__