【问题标题】:Base class not permitted to access private member?基类不允许访问私有成员?
【发布时间】:2013-07-19 15:21:33
【问题描述】:

我可以发誓,在标准 OOP 中,您可以从基类中的方法访问具体类的私有成员。 PHP 只是以不同的方式实现这一点,还是我做错了什么,还是我的理解完全错误?

<?php

class Base {
  public function __toString() {
    return $this->name;
  }
}

class Concrete extends Base {
  private $name;

  public function __construct($name) {
    $this->name = $name;
  }
}

$o = new Concrete('foobar');
echo $o;

上面的代码片段抛出Fatal error: Cannot access private property Concrete::$name on line 5。如果我将$name 的访问级别更改为protected,它将起作用。

Demo

【问题讨论】:

  • 如果扩展 Base 并且不在子类中引入属性 $name 怎么办?基类绝不能依赖子类!
  • 没有什么叫做“标准”OOP;每种语言都有它自己的味道。但是,我想不出任何可以使用的语言,从我的脑海中浮出水面......
  • 你想在这里做什么?我听说过控制反转,但我从未听说过继承反转...
  • @stobor:无论如何,并非没有魔法gettersm ;-)
  • @Niko:这就是重点。我的代码片段不起作用是完全有道理的。谢谢!

标签: php oop inheritance


【解决方案1】:

private 通常意味着它只能从类中访问。我认为这是预期的行为。

来自 PHP 文档:

属性或方法的可见性可以通过在声明前加上关键字 public、protected 或 private 来定义。声明为 public 的类成员可以在任何地方访问。声明为 protected 的成员只能在类本身内以及被继承类和父类访问。 声明为私有的成员只能由定义该成员的类访问。

【讨论】:

    【解决方案2】:

    没错,私人是完全私人的(我的日常日记),即使是家人也无法访问。受保护的只是保护(我的汽车)不受世界其他地方的影响,但家人可以访问。

    【讨论】:

      【解决方案3】:

      这正是私有和受保护之间的区别。只有我可以看到私有变量,但我的家人可以看到受保护。

      【讨论】:

        猜你喜欢
        • 2013-02-13
        • 2012-05-03
        • 1970-01-01
        • 2021-12-30
        • 2013-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多