【问题标题】:PHP: How to call private values of parent construct in child construct?PHP:如何在子构造中调用父构造的私有值?
【发布时间】:2011-07-24 09:01:21
【问题描述】:

我希望能够在父构造函数中设置私有属性的值,并在子构造函数或方法中调用该值。

例如:

<?php


abstract class MainClass
{
    private $prop_1;
    private $prop_2;


     function __construct()
     {
            $this->prop_2 = 'this is  the "prop_2" property';
     }
}

class SubClass extends MainClass
{
    function __construct()
    {
        parent::__construct();
        $this->prop_1 = 'this is the "prop_1" property';
    }

    public function GetBothProperties()
    {
        return array($this->prop_1, $this->prop_2);
    }

}

$subclass = new SubClass();
print_r($subclass->GetBothProperties());

?>

输出:

Array
(
    [0] => this is the "prop_1" property
    [1] => 
)

但是,如果我将prop_2 更改为protected,输出将是:

Array
(
    [0] => this is the "prop_1" property
    [1] => this is  the "prop_2" property
)

基本了解 OO 和 php,但我不知道是什么阻止了 prop_2private 时被调用(或显示?);它不能是私人/公共/受保护的问题,因为“prop_1”是私人的,可以被调用和显示......对吗?

在子类与父类中分配值是否存在问题?

如果能帮助我理解原因,我将不胜感激。

谢谢。

【问题讨论】:

  • 我在这里可能是错的,但是当您的子类的构造函数运行时,您的代码似乎正在创建一个名为 prop_1 的公共属性。这就是为什么你得到 prop_1 的输出而不是 prop_2 的输出。您应该能够通过在父类中实现 getter 和 setter 来解决这个问题。
  • 感谢 ZeSimon,这就是我一直在寻找的东西(为什么我得到了 prop_1)。
  • 那么回显出来的prop_1不是抽象类的prop_1吗?

标签: php inheritance properties private construct


【解决方案1】:

父类的私有属性不能在子类中访问,反之亦然。

你可以这样做

abstract class MainClass
{
   private $prop_1;
   private $prop_2;


   function __construct()
   {
        $this->prop_2 = 'this is  the "prop_2" property';
   }

   protected function set($name, $value)
   {
        $this->$name = $value;
   }

   protected function get($name)
   {
      return $this->$name;
   }

 }


class SubClass extends MainClass
{
    function __construct()
    {
        parent::__construct();
        $this->set('prop_1','this is the "prop_1" property');
    }

    public function GetBothProperties()
    {
        return array($this->get('prop_1'), $this->get('prop_2'));
    }

}

【讨论】:

  • 这就是private的意思
  • 高兴地投反对票,但要给出这样做的理由。这样我就不会再犯这个错误了。
  • -1 你会失去封装的本质,你不妨将你的属性声明为 public.. 在你的属性或访问器上使用“protected”
  • @pleasedontbelong :感谢您的建议。我做了更改。
  • 谢谢高拉夫。这很有帮助。
【解决方案2】:

如果你想从子类访问父类的属性,你必须使父类的属性受保护而不是私有。这样,它们仍然无法从外部访问。 您不能以您尝试的方式覆盖父类在子类中的私有属性可见性。

【讨论】:

  • 非常感谢,我明白了,但就像我说的,我只是想知道为什么我得到的是 prop_1 而不是 prop_2。显然是因为我在子类中分配了它的值。这对我来说是全新的,我很感激你的帮助。 :)
  • 是的,很抱歉我帮不上忙,我刚刚看到了第一个代码,并在空闲时间猛击了一个 10 秒的答案。现在看起来好像上面已经回答了,所以希望你有你需要的一切。作为一般规则,请尽可能对内部属性使用protected,而不是私有,因为当您/某人需要以您未预测的方式扩展某些内容时,它会减少您的麻烦。
【解决方案3】:

正如其他人所指出的,您需要将父级的属性更改为protected。但是,另一种方法是为您的父类实现一个 get 方法,该方法允许您访问该属性,或者如果您希望能够覆盖它,则实现一个 set 方法。

所以,在你的父类中,你要声明:

protected function setProp1( $val ) {
  $this->prop_1 = $val;
}

protected function getProp1() {
  return $this->prop_1;
}

然后,在您的子类中,您可以分别访问$this-&gt;setProp1("someval");$val = $this-&gt;getProp1()

【讨论】:

    【解决方案4】:

    你可以使用 lambdas 的一个简单技巧,我在这里找到了它:https://www.reddit.com/r/PHP/comments/32x01v/access_private_properties_and_methods_in_php_7/

    基本上你使用一个 lambda 并将它绑定到实例,然后你可以访问它的私有方法和属性

    关于 lambda 调用的信息:https://www.php.net/manual/en/closure.call.php

    【讨论】:

      猜你喜欢
      • 2011-03-06
      • 2018-01-31
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多