【问题标题】:PHP late static binding doesn't work correctlyPHP 后期静态绑定无法正常工作
【发布时间】:2013-03-18 14:06:13
【问题描述】:

在 PHP 中编码和使用后期静态绑定时,我发现了一些奇怪的行为。在其父类中使用static() 创建的子对象可以访问其父类的私有方法。

这是一个例子:

class Attachment
{
  public static function createFromFile($file)
  {
    $attachment = new static();
    echo get_class($attachment) . PHP_EOL;
    $attachment->loadFromFile($file);
  }

  private function loadFromFile($file)
  {
    echo 'attachment';
  }
}

class PictureAttachment extends Attachment
{
  //...
}

PictureAttachment::createFromFile('example.txt');

输出:

PictureAttachment
attachment

这是正确的行为吗?

【问题讨论】:

    标签: php late-static-binding static-binding


    【解决方案1】:

    是的,这是正确的。调用私有方法的类与声明它的类相同。它可能会或可能不会实例化子类并不重要。您只是不能在子类中有任何代码调用父类的私有方法。

    换句话说:

    class Foo {
    
        protected function bar() {
            $this->baz();
        }
    
        private function baz() { }
    
    }
    
    class Bar extends Foo {
    
        protected function bar() {
            parent::bar();   // <-- works
            parent::baz();   // <-- doesn't work
        }
    
    }
    

    【讨论】:

    • 进一步澄清:可见性在类级别而不是对象级别上起作用。
    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多