【问题标题】:PHP make class propery inheritablePHP 使类属性可继承
【发布时间】:2011-04-19 08:29:08
【问题描述】:

我有 2 个扩展 A 的类 A 和 B。A 有一个公共属性,我希望在 B 的实例上无法访问该属性。我试着解释得更好:

class A
{
    public $prop;
}
class B extends A
{
    ...
}
$instance=new B;
$instance->prop; //This must throw an error like "Undefined property prop"

我尝试使用 final 关键字,但它仅适用于方法而不适用于属性。我还尝试在 B 上设置与 private 相同的属性,但 PHP 不允许将访问级别从公共更改为私有或受保护。

也许这个问题有一个简单的解决方案,但我找不到,所以你知道怎么做吗?

【问题讨论】:

  • 你在扩展别人的课程吗?为什么不能从根源上解决问题?
  • 为什么要将属性声明为公共的(即尽可能广泛的可见性),然后拒绝其访问后代类?
  • 我不想将私有财产设为公共财产,我希望 B 不会继承它。我更改了访问级别只是为了找到一个好的解决方案,但它不起作用
  • 好吧,我不想这么说,但我认为你做错了。继承是当您想要使用子内部的所有底层父类时。如果你不这样做,那么要么你的架构搞砸了(孩子真的不应该扩展父母),或者你的问题最好使用另一种模式来解决(比如composition)......

标签: php class inheritance properties


【解决方案1】:

只需将 public $prop; 更改为 private $prop; 即可通过 $prop public 使其可以通过各种可能的方式访问,但将其设置为 private 将使其只能在类中访问

【讨论】:

  • 我一直在寻找一种方法来保留基类上的属性,但也许没有其他方法。
【解决方案2】:

使用magic methods

class A {
    protected $_prop;
    public function __get($key) {   
        if ($key=='prop') {
            return $this->_prop;
        }
    }

    public function __set($key, $value) {
        if ($key=='prop') {
            return $this->_prop = $value;
        }
    }
}

class B extends A {
    public function __get($key) {
    }

    public function __set($key, $value) {
    }

    // how you can use it
    public function foo() {
        echo $this->_prop;
    }
}

【讨论】:

    【解决方案3】:

    嗯。棘手!

    想到的唯一想法是从一开始就将$prop 设为私有,并使用magic getter and setter functions 来控制访问。您必须将访问信息存储在单独的数组中,然后返回正确的值,或者在 getter 函数中抛出致命错误。

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多