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%)
-----


Raczej nie o to chodziło. Po pierwsze $this->array['cos'] nie zadziała, bo tablica jest prywatna. Nawet jeżeli przeciążysz __get, to żeby dostać się do tablicy w ten sposób musisz zapisać go tak:
  1. <?php
  2. public function __get($var) {
  3.  return $this->$var;
  4. }
  5. ?>

Jeżeli chcesz odwołać się do elementu z tablicy poprzez $this->cos, to wtedy przeciążasz funkcję tak:
  1. <?php
  2. public function __get($var) {
  3. return $this->array[$var];
  4.  }
  5. ?>

Ale wtedy nie odwołasz się do atrybutów obiektu. Jeżeli spróbujesz zrobić coś takiego:
  1. <?php
  2. class SomeClass {
  3. protected $array = array();
  4.  
  5. public function __set($var, $val) {
  6. $this->$var = $val;
  7. }
  8.  
  9. public function __get($var) {
  10. return $this->$var;
  11. }
  12. }
  13.  
  14. $obj = new SomeClass();
  15. $obj->array['xxx'] = 'yyy';
  16. ?>

To wywali:
Kod
Notice: Indirect modification of overloaded property SomeClass::$array has no effect

Jeżeli przeciążysz __set inaczej, to nie wydostaniesz się poza tablicę.

Dyskusja wyglądałaby trochę inaczej, gdyby nie ten modyfikator przy tablicy...

Ten post edytował Ludvik 2.06.2007, 23:07:09
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:05:32 ) *
Raczej nie o to chodziło. Po pierwsze $this->array['cos'] nie zadziała, bo tablica jest prywatna.


Przecież $this używasz tylko w obiekcie, więc to że jest prywatna akurat nie ma nic do znaczenia.
Ech nie chce mi się pisać...
  1. <?php
  2. class SomeClass {
  3. private $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];//jedne sposób dostania, bezpośredni
  14.  echo $this->$var;//drugi, pośredni przez __get()
  15. }
  16. }
  17.  
  18. $obj = new SomeClass();
  19. $obj->xxx = 'yyy<br />';
  20. echo $obj->xxx;
  21. $obj->cos( 'xxx' );
  22. ?>


EDIT: głupia kontrola danych (i zmiana) jest na tej stronie

Ten post edytował Sedziwoj 2.06.2007, 23:36:26
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: 3.10.2025 - 11:58