dj.drezyna Napisano Kwiecień 23, 2013 Zgłoś Share Napisano Kwiecień 23, 2013 class Jedna { public $tab = array('a'); public function wez() { return $this->tab; } } class Druga extends Jedna { public $tab = array('b'); public function wez() { return parent::wez()+$this->tab; } } $druga = new Druga(); print_r($druga->wez()); I niestety zwraca tabelę array('b'), a nie oczekiwaną tabelę array('a','b') Co zatem zrobić by pole tab z podrzędnej klasy pobrać i wzbogacić o nie klasę nadrzędną? Dzięki za pomoc, pozdr,! Galeria przyrodnicza http://fotokrajobrazy.warmia.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Blind Napisano Kwiecień 23, 2013 Zgłoś Share Napisano Kwiecień 23, 2013 W konstruktorze dodac 'b' do tablicy? Poza tym nie ma czegos takiego jak nadrzedne publiczne pole. www.blinder.pl - Blog Link do komentarza Udostępnij na innych stronach More sharing options...
sazian Napisano Kwiecień 24, 2013 Zgłoś Share Napisano Kwiecień 24, 2013 rozwiązanie jest bardzo proste otóż pola klasy nigdy nie powinny być publiczne, a dostęp do nich powinien "następować" poprzez gettery i settery class Jedna { private $tab = array('a'); public function wez() { return $this->tab; } } class Druga extends Jedna { private $tab = array('b'); public function wez() { return array_merge(parent::wez(),$this->tab); } } $druga = new Druga(); print_r($druga->wez()); Link do komentarza Udostępnij na innych stronach More sharing options...
dj.drezyna Napisano Kwiecień 24, 2013 Autor Zgłoś Share Napisano Kwiecień 24, 2013 Tak podejrzewałem. Ale Najpierw należy się wyjaśnienie skąd przyszło mi do głowy sprawdzić takie coś. Otóż w cakephp jest np tablica helpers, components i uses, które są wszystkie publiczne więc jak oni to obchodzą? Bo napisane jest w książce ,,Kucharskiej'': ,, While normal object-oriented inheritance rules apply, CakePHP does a bit of extra work when it comes to special controller attributes. The list of components and helpers used by a controller are treated specially. In these cases, AppController value arrays are merged with child controller class arrays. The values in the child class will always override those in AppController. '' Więc jak to działa? Bo sam mechanizm mi się bardzo podoba ale nie wiem jak oni obchodzą te zachowanie php nadpisywania publicznych pól? Tworzą tymczasowe pola prywatne? Bredzę ale bardzo mnie to ciekawi. Jak ktoś wie to bardzo dziękuję za podzielenie się tą wiedzą. Dzięks i pozdrawiam, Edytowano: 13:58>> A to prawdziwe cwaniaki no! class Jedna { public $tab = array('a'); public function wez() { return $this->tab; } } class Druga extends Jedna { public $tab = array('b'); public function wez() { $wynik = array(); $nadrzedna = 'Jedna'; if (is_subclass_of($this,$nadrzedna)) { $zmn = get_class_vars($nadrzedna); if (is_array($zmn['tab'])) { $wynik = $zmn['tab']; } } return array_merge($wynik,$this->tab); } } $druga = new Druga(); print_r($druga->wez()); Galeria przyrodnicza http://fotokrajobrazy.warmia.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.