Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> jak odczytać automatycznie nazwy pól obiektu?
jafet
post
Post #1





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 26.09.2004
Skąd: Białystok

Ostrzeżenie: (0%)
-----


Witam!

Czy ktoś z Was wie jak odczytać nazwy pól obiektu, jeśli były one ustawiane metodą __set?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Zależy mi na takim oto rozwiązaniu: Mam klasę View(). Dla obiektu tej klasy w kontrolerze ustawiam różne dane. Ponieważ może być ich zmienna liczba, dlatego nie chcę towrzyć stałych pól np $model1, $model2, zamiast tego używam metody __set do ich ustawiania. Teraz w metodzie show() chcę odczytać nazwy tych pól i przypisać je do szablonu Smarty. Próbowałem to zrobić funkcją get_class_vars(get_class($this)) ale okazało się, że odczytuje ona tylko pola predefiniowane wcześniej w klasie. Pól ustawionych za pomocą __set nie widzi (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Jeśli ktoś ma jakiś pomysł będę wdzięcny.

Oto kod:
  1. <?php
  2.  
  3. abstract class View
  4. {
  5. public function __construct()
  6. {
  7.  
  8. }
  9.  
  10. public function __set($pole, $extra_model)
  11. {
  12. $this->$pole = $extra_model;
  13.  
  14. }
  15.  
  16. function __get($nazwa)
  17. {
  18. return $this->$nazwa;
  19. }
  20.  
  21. }
  22.  
  23. class HTMLView extends View
  24. {
  25. protected $smarty;
  26.  
  27. public function __construct()
  28. {
  29. parent::__construct();
  30. $this->smarty = new Smarty();
  31.  
  32. }
  33.  
  34. public function show()
  35. {
  36.  
  37. $fields = get_class_vars(get_class($this));
  38.  
  39. foreach ($fields as $name => $value) {
  40.  
  41. if ($name!='tamplate' && $name!='smarty')
  42. {
  43. $pole = "'".$name."'";
  44. $this->smarty->assign($pole, $name); 
  45. }
  46. }
  47.  
  48. $this->smarty->display($this->tamplate);
  49.  
  50. }
  51.  
  52. public function __call($name,$param)
  53. {
  54. echo "Próbowałeś wywołać metodę której nie ma ".$name;
  55. }
  56. }
  57. ?>



A oto przykład użycia w kontrolerze:
  1. <?php
  2.  
  3. $hview = new HTMLView();
  4. $hview->lista = $lista;
  5. $hview->tamplate="'".$this->tpl_prefix."list.tpl'";
  6. $hview->show();
  7.  
  8. ?>


Myslę, że sprawa jest warta zachodu, bo czy przypiszemy jedną listę czy 15, klasa HTMLView za nas robiłaby całe przypisanie do Smarty. Poza tym kod jest zupełnie niezależny od danych pobranych z modelu.

Ten post edytował jafet 20.04.2006, 22:49:26
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
LBO
post
Post #2





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


HA! Miałem rację, poprzez iterację są widoczne również dynamiczne pola klasy.
Przeanalizujcie sobie ten przykład.
  1. <?php
  2. class Example {
  3. public $publicParent = 'publicParent';
  4. private $private1Parent = 'privateParent';
  5. protected $protectedParent = 'protectedParent';
  6.  
  7. public function __set($name, $value) {
  8. $this->$name = $value;
  9. }
  10.  
  11. public function __get($name) {
  12. return $this->$name;
  13. }
  14. }
  15.  
  16. class ShowExample extends Example {
  17. public $publicChild = 'publicChild';
  18. private $private1Child = 'privateChild';
  19. protected $protectedChild = 'protectedChild';
  20.  
  21. public function show() {
  22. foreach($this as $name => $value) {
  23. print $name.' => '.$value.'<br />';
  24. }
  25. }
  26. }
  27.  
  28. function iterateOverObject($obj) {
  29. foreach($obj as $name => $value) {
  30. print $name.' => '.$value.'<br />';
  31. };
  32. };
  33.  
  34. $example = new ShowExample();
  35. $example->name_01 = 'value 01';
  36. $example->name_02 = 'value 02';
  37. $example->name_03 = 'value 03';
  38. print('Iteracja poprzez metode klasy <br />');
  39. $example->show();
  40. print('Iteracja poprzez funckjк zewnкtrzna <br />');
  41. iterateOverObject($example);
  42. ?>

a to jest output:
Kod
Iteracja poprzez metode klasy
  publicChild => publicChild
  private1Child => privateChild
  protectedChild => protectedChild
  publicParent => publicParent
  protectedParent => protectedParent
  name_01 => value 01
  name_02 => value 02
  name_03 => value 03

Iteracja poprzez funckję zewnętrzna
  publicChild => publicChild
  publicParent => publicParent
  name_01 => value 01
  name_02 => value 02
  name_03 => value 03


Oj, dopiero teraz zauważyłem ten warunek:
Cytat
Czy ktoś z Was wie jak odczytać nazwy pól obiektu, jeśli były one ustawiane metodą __set?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
. Więc to co napisałem, raczej się tobie nie przyda ~jafet.

Ten post edytował LBO 21.04.2006, 21:37:50
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 13.10.2025 - 09:04