dj.drezyna Posted April 23, 2013 Report Share Posted April 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 to comment Share on other sites More sharing options...
Blind Posted April 23, 2013 Report Share Posted April 23, 2013 W konstruktorze dodac 'b' do tablicy? Poza tym nie ma czegos takiego jak nadrzedne publiczne pole. www.blinder.pl - Blog Link to comment Share on other sites More sharing options...
sazian Posted April 24, 2013 Report Share Posted April 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 to comment Share on other sites More sharing options...
dj.drezyna Posted April 24, 2013 Author Report Share Posted April 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 to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.