Jump to content

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


dj.drezyna

Recommended Posts

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

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

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

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...