从孩子那里访问父类的财产

时间:2010-02-17 19:44:09

标签: php oop

请参阅以下示例(PHP)

class Parent
{ 
  protected $_property;
  protected $_anotherP;

  public function __construct($var)
  {
    $this->_property = $var;
    $this->someMethod();  #Sets $_anotherP
  }

  protected function someMethod()
  ...
}

class Child extends Parent
{
  protected $parent;

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

  private function myMethod()
  {
    return $this->parent->_anotherP;  #Note this line
  }
}

我是OOP的新手并且有点无知。

这里访问parent属性我正在使用该类的一个实例,这似乎是错误的:S(不需要我是孩子)。是否有一种简单的方法,以便我可以将父属性与子属性同步,并且可以直接访问$ this-> anotherP而无需使用$ this-> parent-> anotherP?

3 个答案:

答案 0 :(得分:30)

当您的Child班级扩展您的Parent班级时,public班级中的protectedParent的每个属性和方法都会被看到在Child类中,好像它们是在Child类中定义的 - 而另一种方式是在周围。

Childextends Parent班级时,可以将其视为ChildParent - 这意味着Child具有Parent的属性,除非它重新定义了另一种方式。

(顺便说一句,请注意“parent”是一个保留关键字,在PHP中 - 这意味着你不能用该名称命名一个类)


以下是“父级”类的快速示例:

class MyParent {
    protected $data;
    public function __construct() {
        $this->someMethodInTheParentClass();
    }
    protected function someMethodInTheParentClass() {
        $this->data = 123456;
    }
}

这是“孩子”课程:

class Child extends MyParent {
    public function __construct() {
        parent::__construct();
    }
    public function getData() {
        return $this->data; // will return the $data property 
                            // that's defined in the MyParent class
    }
}

可以这样使用:

$a = new Child();
var_dump($a->getData());

你会得到输出:

int 123456

这意味着$data类中定义的MyParent属性,并在同一MyParent类的方法中初始化,Child类可以访问该属性,就像这是它自己的。


为简单起见:因为Child“是一个”MyParent,它不需要指向...本身; - )

答案 1 :(得分:0)

这可以节省您几个小时的搜索时间。

请记住:您的Child类仅继承Parent类中的DEFINED属性...因此,如果使用Parent类实例化对象,然后使用数据填充它,那么这些数据将不会在您的子类中可用...

当然,这是非常明显的,但我猜其他人可能遇到同样的问题。

一个超级简单的解决方案是不扩展任何东西,只需通过构造函数将父类的$对象传递给子类。这样,您就可以访问由父类

生成的对象的所有属性和方法

实施例

class child {

    public parentObject;

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

}

如果$ parentObject具有公共属性$ name,那么您可以使用以下函数在子类中访问它:

public function print_name() {
    echo $this->parentObject->name;
}

答案 2 :(得分:-2)

这应该有用..

class Child extends Parent
{
  private function myMethod()
  {
    return $this->_anotherP;
  }
}

因为_anotherP它受保护,所以每个派生类都可以访问它,但它不在另一个对象中,它是同一个对象。

然而,让吸气者在父母身上成为一个明智的选择。