Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP5 OOP] Użycie metody __set dla składowej jako tablicy
phpion
post
Post #1





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Hej!
Mam pewien problem. W jaki sposób wykonać metodę __set($param, $value) dla składowej klasy będącej tablicą? Może podam na przykładzie:
  1. <?php
  2. class SomeClass {
  3. private $array = array(
  4. 'field' => 'value'
  5. );
  6.  
  7. public function __set($param, $value) {
  8. $this->$param = $value;
  9. }
  10. }
  11.  
  12. $obj = new SomeClass();
  13. echo "<pre>".print_r($obj, true)."</pre>";
  14.  
  15. $obj->__set("array['field']", "change");
  16. echo "<pre>".print_r($obj, true)."</pre>";
  17. ?>

Co w rezultacie daje:
  1. SomeClass Object
  2. (
  3. [array:private] => Array
  4. (
  5. [field] => value
  6. )
  7.  
  8. )
  9. SomeClass Object
  10. (
  11. [array:private] => Array
  12. (
  13. [field] => value
  14. )
  15.  
  16. [array['field']] => change
  17. )

W jaki sposób zmienić wartość $this->array['field']?

PS: wiem, że można to zrobić tworząc osobną metodę zmieniającą element tablicy ale czy da się to samo osiągnąć korzystając z __set()?

Ten post edytował phpion.com 2.06.2007, 11:00:50
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Ludvik
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Cytat
Przecież $this używasz tylko w obiekcie, więc to że jest prywatna akurat nie ma nic do znaczenia.

Nie doczytałem, trochę późno jest jak dla mnie (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Cytat
Heh, chyba sie nie do końca zrozumieliśmy. To, że w ten sposób można to wiem ale przy takiej postaci __set() nie będzie można ustawić parametrów, które nie są $this->array. Jeżeli będę miał składową np. private skladowa; to wywołanie __set() w postaci przedstawionej przez Ciebie będzie ustawiało $this->array['skladowa'] zamiast $this->skladowa.

Tutaj jest problem. phpion.com chciał mieć możliwość jednoczesnego operowania i na tablicy array i na zwykłych atrybutach obiektu. W ten sposób, niestety, nie uda się tego zrobić...

EDIT: Powiedzmy, że udało mi się to zrobić tak:
  1. <?php
  2. class SomeClass {
  3. private $array = array();
  4.  
  5. private $skladowa = 0;
  6.  
  7. public function __set($var, $val) {
  8. if (isset($this->$var)) {
  9. $this->$var = $val;
  10. } else {
  11. $this->array[$var] = $val;
  12. }
  13. }
  14.  
  15. public function __get($var) {
  16. if (isset($this->$var)) {
  17. return $this->$var;
  18. } else {
  19. return $this->array[$var];
  20. }
  21. }
  22. }
  23.  
  24. $obj = new SomeClass();
  25.  
  26. $obj->skladowa = 1;
  27. $obj->nieskladowa = 'xxx';
  28. ?>


Ten post edytował Ludvik 2.06.2007, 23:45:24
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #3





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Cytat(Ludvik @ 3.06.2007, 00:41:38 ) *
Nie doczytałem, trochę późno jest jak dla mnie (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Tutaj jest problem. phpion.com chciał mieć możliwość jednoczesnego operowania i na tablicy array i na zwykłych atrybutach obiektu. W ten sposób, niestety, nie uda się tego zrobić...

Czyli $obj->xxx i $obj->array['xxx']?
  1. <?php
  2. class SomeClass {
  3. public $array = array();
  4.  
  5. public function __set($var, $val) {
  6. $this->array[$var] = $val;
  7. }
  8.  
  9. public function __get($var) {
  10. return $this->array[$var];
  11. }
  12. public function cos( $var ){
  13.  echo $this->array[$var];
  14.  echo $this->$var;
  15. }
  16. }
  17.  
  18. $obj = new SomeClass();
  19. $obj->xxx = "yyy<br />n";
  20. echo $obj->xxx;
  21. $obj->cos( 'xxx' );
  22. echo $obj->array['xxx'];
  23. ?>


Tylko jaki jest sens tego?
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 11.10.2025 - 05:26