2016-06-30 7 views
-2

Я пытаюсь автоматизировать проверку формы и процесс вставки db. В определенной части мне нужно иметь доступ к родительскому классу из дочернего класса. Чтобы быть точным, мне нужно получить доступ к родительскому классу для доступа к другому дочернему классу.Как получить доступ к родительскому классу из дочернего класса?

Я попытался повторить ту же структуру, я использую в реальном коде:

class Family { 
    public function __construct($members = []) { 
     foreach ($members as $member) { 
      $this->$member[0] = new Member($member); 
     } 
    } 
} 
class Member { 
    public $name; 
    public $niisan; 
    public function __construct($name = []) { 
     $this->name = $name[0]; 
     if (count($name) > 1) { 
      $this->get_niisan($name[1]); 
     } 
    } 
    public function get_niisan($member_lookup) { 
     $this->niisan = $this->name . " has a niisan named X"; 
    } 
} 

$Winchesters = new Family([ 
    ["Dean"], 
    ["Sam", "Dean"], 
]); 

Выход:

object(Family)#1 (2) { 
    ["Dean"] => object(Member)#2 (2) { 
     ["name"] => "Dean" 
     ["niisan"] => NULL 
    } 
    ["Sam"]  => object(Member)#3 (2) { 
     ["name"] => "Sam" 
     ["niisan"] => "Sam has a niisan named X" 
    } 
} 

То, что я хочу сделать, это создать два подкласса в основной класс. Важен порядок создания подклассов. ["Sam"] зависит от ["Dean"], поэтому ["Dean"] необходимо создать в первую очередь. Некоторые из свойств ["Dean"] будут использованы в ["Sam"].

В JavaScript, я бы написал так:

function Family(members) { 
    var parent = this; // Family object 
    for (var i = 0; i < members.length; i++) { 
     // passing a reference of Family to the new Member object 
     // so that it can access the main object later 
     this[members[i][0]] = new Member(parent, members[i]); 
    } 
} 

function Member(parent, name) { 
    // saving the reference to the parent object 
    this.parent = parent; 
    this.name = name[0]; 
    this.niisan = ""; 
    this.get_niisan = function (lookup) { 
     // accessing the parent object and then getting the name property of "Dean" object 
     this.niisan = this.name + " has a niisan named " + this.parent[lookup].name; 
    }; 
    if (name.length > 1) { 
     this.get_niisan(name[1]); 
    } 
} 

var Winchesters = new Family([ 
    ["Dean"], 
    ["Sam", "Dean"] 
]); 

Передача основной объект каждого суб-объекта. PHP должен иметь свой собственный способ справиться с этим. Я просто этого не знаю.


Обновление: Для вниз/закрытия избирателя: Как это неясно?

У меня есть два класса: семья и член. Класс участника инициализируется внутри класса Family. Следующий код

$Winchesters = new Family([ 
    ["Dean"], 
    ["Sam", "Dean"], 
]); 

результаты:

object(Family)#1 (2) { 
    ["Dean"] => object(Member)#2 (2) { 
     ["name"] => "Dean" 
     ["niisan"] => NULL 
    } 
    ["Sam"]  => object(Member)#3 (2) { 
     ["name"] => "Sam" 
     ["niisan"] => "Sam has a niisan named X" 
    } 
} 

Во время выполнения сначала Member с именем «Дин» создается и присваивается переменной Dean внутри Family. Во-вторых, Member «Сэм» создан, но Sam зависит от первого созданного объекта, Dean. Sam необходимо получить доступ к родительскому классу Family, а затем получить доступ к Dean и получить свойство name и использовать его при назначении переменной niisan.

Пожалуйста, проверьте пример JavaScript. Я хочу подражать точной функциональности в PHP. Передайте основной класс дочернему классу, чтобы дочерний класс мог получить доступ к более поздним переменным внутри основного класса.

+1

'родитель :: methodname' – Farkie

+0

@Farkie Я буду доступ к суб-класс в главном классе. Как мне реализовать «parent :: methodname» таким образом, чтобы эта строка работала над $ this-> niisan = $ this-> name. «имеет ниизан по имени». Родитель :: $ member_lookup-> имя; '? – akinuri

+0

'$ this -> $ member [0] = new Member ($ member);' каждый раз перезаписывает один и тот же элемент массива 'member'. Кроме того, это должен быть '$ this-> member', а не' $ this -> $ member'. – Barmar

ответ

2

Ваша терминология в замешательстве. В PHP ООП, родитель и ребенок обычно относятся к отношениям между классами, которые наследуют друг от друга, а не объекты этих классов (C++ называют их базы и полученными класса и Javascript использует прототип цепь для родительских классов).

Что вам нужно сделать, это сохранить ссылку на Family в классе Member.

class Member { 
    public $name; 
    public $niisan; 
    public $family; 

    public function __construct($name = [], $family) { 
     $this->family = $family; 
     $this->name = $name[0]; 
     if (count($name) > 1) { 
      $this->get_niisan($name[1]); 
     } 
    } 
    public function get_niisan($member_lookup) { 
     $this->niisan = $this->name . " has a niisan named X"; 
    } 
} 

class Family { 
    public function __construct($members = []) { 
     foreach ($members as $member) { 
      $this->$member[0] = new Member($member, $this); 
     } 
    } 
} 

Тогда если Member класс хочет получить доступ братьев и сестер, он может использовать $this->family, чтобы получить содержащий семью.

BTW, используя переменные свойства в Family - плохой дизайн, ИМХО. Вместо этого, вы должны использовать один $member свойство, содержащее ассоциативный массив:

$this->members = array(); 
foreach ($members as $member) { 
    $this->members[$member[0]] = new Member($member, $this); 
} 
+0

Это именно то, что я искал. Еще раз спасибо, Бармар. Я не очень-то знаком с классами и всеми. Я в основном код в JavaScript. Время от времени возникают проблемы. – akinuri

3

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

Вы не можете получить доступ к другому дочернему классу из родительского класса. Только ребенок может получить доступ к родительскому элементу. В вашем примере вы не создали никакого наследования. Так вы создаете наследование в PHP.

class FooParent { 
    public function display($text) { 
     echo $text; 
    } 
} 

class Foo extends FooParent { 
    public function someMethod() { 

     // ask the parent to display the text 
     parent::display("Hello World!"); 
    } 
} 

$foo = new Foo(); 
$foo->someMethod(); 

Будет отображаться «Hello World!».Надеюсь, это поможет вам начать работу, чтобы узнать больше о версии PHP OOP. http://php.net/manual/en/language.oop5.php

+0

Он не говорит о родительских классах, он говорит об отношениях в иерархии контейнеров. – Barmar

+0

@Barmar Nice catch ... Я был брошен его терминологией и первым комментарием, который ответил с помощью родительского метода :: method ... проголосовал за ваш ответ. – Katie

Смежные вопросы