![]() |
![]() ![]() |
![]() |
![]()
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:
Co w rezultacie daje:
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 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
-------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Wow, aż się dziwię, że można modyfikować wartość składowej będącej prywatną :| No ale dzięki.
Hmm, w sumie nie działa do końca jak powinno bo przypisuje składowej nową tablicę, a mi chodziło o zmianę wartości dla jednego indeksu. Mając w $this->array kilka elementów tracimy je. Ten post edytował phpion.com 2.06.2007, 11:46:47 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
-------------------- |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
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.
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Nie zrobisz 2 rzeczy na raz... Albo ograniczasz się do tablicy, albo robisz tak jak napisał Sedziwoj. Ewentualnie możesz dopisać gettera i zrobić coś w stylu:
-------------------- |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
No właśnie o to mi chodziło czy można to machnąć w jednej metodzie (bez warunków po nazwie składowej).
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Nie zrobisz 2 rzeczy na raz... A zrobisz, bo jeśli dobrze pamiętam $this->cos, szuka najpierw właściwości klasy o tej nazwie jak nie znajduje odpala __get() więc można odwołać się i $this->array['cos'] jak i $this->cos gdy
-------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
![]()
Post
#9
|
|
![]() 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:
Jeżeli chcesz odwołać się do elementu z tablicy poprzez $this->cos, to wtedy przeciążasz funkcję tak:
Ale wtedy nie odwołasz się do atrybutów obiektu. Jeżeli spróbujesz zrobić coś takiego:
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 -------------------- |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
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ć...
EDIT: głupia kontrola danych (i zmiana) jest na tej stronie Ten post edytował Sedziwoj 2.06.2007, 23:36:26 -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
![]()
Post
#11
|
|
![]() 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 ![]() 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:
Ten post edytował Ludvik 2.06.2007, 23:45:24 -------------------- |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Nie doczytałem, trochę późno jest jak dla mnie ![]() 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']?
Tylko jaki jest sens tego? -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 1 470 Pomógł: 75 Dołączył: 21.09.2005 Skąd: że znowu Ostrzeżenie: (0%) ![]() ![]() |
sugeruje użyć ArrayAcces i będzie po problemie
-------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 29.06.2025 - 21:37 |