2010-02-17 6 views
12

следующий пример (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 
    } 
} 

Я новичок в ООП, и я немного невежественны.

Здесь, чтобы получить доступ к родительскому свойству, я использую экземпляр этого класса, который кажется неправильным: S (тогда не нужно быть потом ребенком). Есть ли простой способ, чтобы я мог синхронизировать родительские свойства с дочерними свойствами и может напрямую обращаться к $ this-> anotherP, не используя $ this-> parent-> anotherP?

ответ

27

Как ваш Child класс расширяет свой Parent класс, каждый свойства и методы, которые являются либо public или protected в Parent классе будет видно по Child класса, как если бы они были определены в Child классе - и другой путь Arround.

Child Когда класс extendsParent класса, его можно рассматривать как «Child является Parent» - это означает, что 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 
    } 
} 

Th в можно использовать так:

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

И вы получите в качестве вывода:

int 123456 

Что означает $data свойство, определенное в MyParent классе, и инициализируется в методе той же MyParent класс, доступен классу Child, как если бы он был его собственным.


Чтобы сделать простые вещи: как Child «является» MyParent, не нужно хранить указатель на ... сам ;-)

+1

да. Вызов родительской :: __ конструкции был тем, что мне нужно: O – shxfee

+0

О, да, это одна из сложных вещей, и я не думал об этом упоминать: если ваш дочерний класс определяет конструктор, PHP не будет вызывать конструктор родительского класса, что означает, что вам придется называть его самостоятельно * (см. примечание на http://fr.php.net/manual/en/language.oop5.decon.php) * –

-2

это должно работать ..

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

потому что _anotherP защищен, поэтому каждый деривативный класс может получить его, но не в другом объекте, его одном и том же объекте.

Однако сделайте геттеры сеттерами в родительском его мудрым выбором.

0

Это может сэкономить вам несколько часов на поиск.

Помните: ваш класс Child только наследует свойства DEFINED в классе родителя ...Поэтому, если вы создаете экземпляр объекта, используя класс родителя, а затем заполняете его данными, тогда эти данные НЕ будут доступны в вашем дочернем классе ...

Это, безусловно, очевидно, но я предполагаю, что другие могут столкнуться с такой же выпуск.

Супер простое решение не продлевает ничего, просто передайте объект $ вашего родительского класса в ваш дочерний класс через конструктор. Таким образом, у вас есть доступ ко всем свойствам и методам объекта, порождаемых родительского класса

Пример

class child { 

    public parentObject; 

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

} 

Если $ parentObject имеет общественную собственность $ имя, то вы можете получить доступ к нему внутри ребенка класс с такой функцией, как:

public function print_name() { 
    echo $this->parentObject->name; 
} 
Смежные вопросы