![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 219 Pomógł: 5 Dołączył: 18.07.2006 Skąd: Piekary Śląskie Ostrzeżenie: (0%) ![]() ![]() |
Jak wiadomo ukazała się niedawno wersja 5.2.0 php
Zainstalowałem ją czym prędzej ale napotkałem problem. Jest klasa:
Do tej pory gdy robiłem
otrzymywałem efekt zgodny z zamierzeniem (wiadomo, że klucz $this->zmienne['dane'] powinien już wcześniej istnieć i istnieje). Metoda __get zwraca referencję do odpowiedniego obszaru w pamięci i przypisywana jest tam wartość 'wartosc'. W php 5.1.x działa bez problemu. W php 5.2.0 nie przypisuje. Spotkał się jeszcze ktoś z tym. Dodam, że generalnie metody magiczne działają. -------------------- CMS dla Twojej firmy
Wojciech Małota |
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Nie probowalem ale dopiero od 5.2 mozna ponoc zmieniac zwrocona tablice przez __get(), a sproboj usunac '&' sprzed metody.
O: Cytat Fixed bug #38146 Cannot use array returned from foo::__get('bar') in write context). (Dmitry) (5.2)
-------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 219 Pomógł: 5 Dołączył: 18.07.2006 Skąd: Piekary Śląskie Ostrzeżenie: (0%) ![]() ![]() |
Nie probowalem ale dopiero od 5.2 mozna ponoc zmieniac zwrocona tablice przez __get(), a sproboj usunac '&' sprzed metody. Już tego próbowałem zanim wysłałem posta na forum. Wcześniej znalazłem też notkę o tym bugu, o którym mówisz i byłem mocno zaskoczony. Poza tym ja nie dostaję komunikatu "Fatal error: Cannot use array returned from foo::__get ('bar') in write context", który jest zaqcytowany w noce o tym bugu. U mnie przypisanie jest wykonywane tak jakby poprawnie. Tylko jakby nie widział, że to jest referencja. Ha! Zrobilem jeszcze testy. mam klase jak ostatnio tylko lekko zmodyfikowana. bardziej odzwierciedla przypadek z mojego rzeczywstego skryptu bo to tutaj chyba lezy bug.
I teraz:
Teraz jesli zrobie:
To na ekranie jest drukowane:
Dodam, ze na php 5.1.x nie ma problemów. ?> Z dalszych testów wynika, że następujący kod:
Zachowuje się poprawnie. Ten post edytował cicik 8.11.2006, 09:21:43 -------------------- CMS dla Twojej firmy
Wojciech Małota |
|
|
![]()
Post
#4
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
A probowales BEZ '&'
![]() Cytat Z dalszych testów wynika, że następujący kod:
To chyba oczywiste, bo
tu dziala __set() a stare dane zostana usuniete -------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 219 Pomógł: 5 Dołączył: 18.07.2006 Skąd: Piekary Śląskie Ostrzeżenie: (0%) ![]() ![]() |
A probowales BEZ '&' ![]() No przecież napisałem, że próbowałem. Efekt ten sam. -------------------- CMS dla Twojej firmy
Wojciech Małota |
|
|
![]()
Post
#6
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Sorry - nie zauwazylem.
A czemu nie zrobisz po prostu:
zamiast uzywania tablicy? (sciagam i instaluje php 5.2) -------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 219 Pomógł: 5 Dołączył: 18.07.2006 Skąd: Piekary Śląskie Ostrzeżenie: (0%) ![]() ![]() |
Sorry - nie zauwazylem. A czemu nie zrobisz po prostu:
zamiast uzywania tablicy? (sciagam i instaluje php 5.2) Bo kod, który podałem jest tylko przykładem ilustrującym błąd. W rzeczywistości jest mi to po prostu potrzebne. -------------------- CMS dla Twojej firmy
Wojciech Małota |
|
|
![]()
Post
#8
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Testuje na 5.2.0 error_reporting( E_ALL | E_STRICT)
1.
Kod Notice: Undefined index: dane in /services/php.dev/www/test/ref_do_tabli_z__get.php on line 33 to jasne -- uzywa __get()'a a taki index nie istnieje a przypisanie
nie zadziala Kod Notice: Indirect modification of overloaded property test::$dane has no effect in /services/php.dev/www/test/ref_do_tabli_z__get.php on line 37 2.
wynik:
tobie to sie nie pojawia? 3. ta sama klasa ( z __set())
wynik Kod object(test)#1 (1) { ["zmienne:private"]=> array(0) { } } object(test)#1 (1) { ["zmienne:private"]=> array(1) { ["dane"]=> string(3) "aaa" } } object(test)#1 (1) { ["zmienne:private"]=> array(1) { ["dane"]=> array(1) { [0]=> string(3) "aaa" } } } bool(true) object(test)#1 (1) { ["zmienne:private"]=> array(2) { ["dane"]=> array(1) { [0]=> string(3) "aaa" } ["xxx"]=> NULL } } Linki http://framework.zend.com/issues/browse/ZF-460 http://www.derickrethans.nl/overloaded_properties_get.php -------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 219 Pomógł: 5 Dołączył: 18.07.2006 Skąd: Piekary Śląskie Ostrzeżenie: (0%) ![]() ![]() |
Nie jestem teraz w domu ale sprawdzę jak wrócę. Pewnie mam wyłączone pokazywanie Notice.
Z linków, które podałeś wynika, że dane zwracane przez __get, nie będące obiektami są read-only. Bez sensu... -------------------- CMS dla Twojej firmy
Wojciech Małota |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 359 Pomógł: 1 Dołączył: 16.04.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
nie powinno byc __set() ?
Edit: sorka nie zauwazylem ;/ Ten post edytował envp 10.11.2006, 23:44:53 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 6.07.2025 - 09:18 |