Skocz do zawartości
Zaloguj się, aby obserwować  
dj.drezyna

Dostęp do narzędnych publicznych pól klasy

Polecane posty

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,!

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

W konstruktorze dodac 'b' do tablicy?

Poza tym nie ma czegos takiego jak nadrzedne publiczne pole.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

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());

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

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());

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się
Zaloguj się, aby obserwować  

×