Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]metoda setValue a __set()
Forum PHP.pl > Forum > Przedszkole
Wolfie
Witam,


Mam do was takie pytanie :

Chcę zrobić klasę która będzie zwracać obiekt (chyba tak to można nazwać), element biblioteki javascript ext.


Taki przykładowy element (obiekt) wygląda tak :

[JAVASCRIPT] pobierz, plaintext
  1. var panel = new Ext.Window({
  2. width:600,
  3. height:250,
  4. loadMask : true,
  5. minimizable: true,
  6. maximizable: true,
  7. layout: 'fit',
  8. closeAction: 'hide',
  9. items: [media_grid],
  10. listeners:{
  11.  
  12. hide:function(){
  13. button1.enable();
  14. }
  15. }
[JAVASCRIPT] pobierz, plaintext


Jak widać mamy tutaj pola 'nazwa : wartość' i teraz zastanawia mnie w jaki sposób najlepiej stworzyć klasę która będzie tworzyć takie obiekty, od razu zaznaczam że zamysł jest taki że każdy element będzie miał osobną klasę.

Więc są dwie możliwości, jedna z nich wygląda tak :

  1.  
  2. class object {
  3.  
  4. private $width;
  5.  
  6. function setWidth($width) {
  7. $this->width = $width;
  8. }
  9.  
  10. function getWidth() {
  11. return $this->width;
  12. }
  13.  
  14. }



Czy może lepiej będzie użyć do tego metod magicznych __set() i __get() ? czyli :

  1.  
  2. class object {
  3.  
  4. function __set($name, $value) {
  5. $this->name = $value;
  6. }
  7.  
  8. function __get($name) {
  9. if(isset($name)) {
  10. return $this->name;
  11. } else {
  12. throw new Exception ('Pole '.$name.' nie istnieje');
  13. }
  14. }
  15.  
  16. }



Zaznaczę że nigdy nie korzystałem z metod magicznych __set() i __get() więc nie wiem czy to dobry pomysł i jak to ma się do zamysłu architektonicznego.....proszę o pomoc.... smile.gif

-----------------------
Ktoś może pomóc , a może temat nie nadaję się na przedszkole ?
piotrekkr
Generalnie ja używałem __set() i __get() np dla klasy która mapuje tablice na obiekt. Np:

  1. class ArrayMapper{
  2. protected $_elements = array();
  3.  
  4. public functon __construct(array $data){
  5. foreach($data as $key => $val){
  6. if(is_array($val)) $val = new ArrayMapper($val);
  7. $this->_elements[$key] = $val;
  8. }
  9. }
  10.  
  11. public function __set($name, $value){
  12. if(is_array($value)){
  13. $value = new ArrayMapper($value);
  14. }
  15. $this->_elements[$name] = $value;
  16. }
  17. public function __get($name){
  18. if(isset($this->_elements[$name]){
  19. return $this->_elements[$name];
  20. }
  21. return null;
  22. }
  23. }


Generalnie jakoś unikam używania publicznych pól klasy. Jak coś chcę ustawić tworzę publiczną metodę setCos($wartosc){...}, dzięki temu, jeśli będzie potrzeba, mogę sobie przefiltrować w prosty sposób wartość ustawianą i jak coś np. rzucić wyjątkiem. Poza tym jeśli robię ustawianie pola z wysokością np: $object->height = '199';, zawsze jest spora szansa że zrobię literówkę i zamiast 'height' wpiszę 'heigth' i niby wszystko jest ok ale nie działa. I debugowanie czegoś takiego to męka :/
darko
Cytat
Generalnie jakoś unikam używania publicznych pól klasy.

A kto tu mówi o publicznych polach?

Cytat
zawsze jest spora szansa że zrobię literówkę i zamiast 'height' wpiszę 'heigth' i niby wszystko jest ok ale nie działa.

Dajesz w setterze warunek if(property_exists($this, $property)) { // ustaw } else {throw new Exception('Nie ma takiego pola!'); } i po problemie.

To ja napiszę tak: jeśli masz mieć dość dużo atrybutów dla każdego z obiektów i do każdego masz pisać osobno getter i setter, bo polecam magiczny setter i getter. Pola ustaw jako protected i po sprawie. Innym rozwiązaniem jest zaimplementowanie metody (nazwę ją setAttribs), która przyjmuje tablicę (pary klucz - wartość: nazwa pola => wartość pola) i w niej robisz foreach na tej tablicy, sprawdzasz czy pole o podanej nazwie istnieje w tej klasie (warunek property_exists) i jeśli tak, to ustawiasz wartość pola o nazwie klucza na wartość z tablicy.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.