【问题标题】:PHP: get_called_class() returns unexpected valuePHP:get_call_class() 返回意外值
【发布时间】:2012-04-18 15:30:36
【问题描述】:

使用 PHP 5.3+ 并具有等于以下内容的内容,我得到的输出是“C”而不是“B”:

class A
{
    public static function doSomething()
    {
        echo get_called_class();
    }
}

class B extends A
{
    public static function doMore()
    {
        self::doSomething();
    }
}

class C extends B {}

C::doMore();

如果我使用了 static::doSomething(),那将是预期的结果,但是当使用 self::doSomething() 时,我希望在 B 的范围内调用此方法,因为它是定义“self”的地方而不是后期的静态绑定。

这是如何解释的?如何在 doSomething() 方法中获得“B”?

提前致谢,JS

【问题讨论】:

    标签: php static self


    【解决方案1】:

    这里的问题是late static bindingget_called_class() 函数将使用后期静态绑定来返回类名,__CLASS__ 如果使用 static:: 调用将使用后期静态绑定,但在与 $this->self:: 一起使用时不会。我不知道如何让它返回B,而不是在B而不是A内有回声。如果您使用的是 PHP 5.4,这听起来像是对特征的理想使用。

    例子:

    class A
    {   
        public static function doSomething()
        {   
            echo __CLASS__;
        }
    }
    
    class B extends A
    {   
        public static function doMore()
        {   
            self::doSomething();
        }
    }
    
    class C extends B {}
    
    C::doMore();
    

    这将返回 A 而不是 C

    【讨论】:

      【解决方案2】:

      重写doSomething方法,得到B

      class C extends B
      {
          public static function doMore()
          {
              B::doMore();
          }
      }
      

      Tested

      【讨论】:

      • 使用 parent 并不能解决问题,因为 get_call_class() 仍然返回“C”,但在这种情况下我需要“B”。即使使用 B::doSomething 也会给我一个“C”作为输出。
      • J.S.我刚刚在 PHP 5.4 上进行了测试。它返回C
      • 感谢测试,这正是我所期望的。但是我在那个地方需要'B',我可以用什么代替 get_call_class 来实现这一点(除了摆弄回溯)?
      猜你喜欢
      • 2020-12-08
      • 2020-06-24
      • 1970-01-01
      • 2013-06-26
      • 2014-12-11
      • 2016-01-30
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      相关资源
      最近更新 更多