Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z dostępem do właściwości klasy
Forum PHP.pl > Forum > PHP
kwiateek
Jestem w trakcie pisania klasy obsługi błędów.
Zarys całego mechanizmu mniej więcej prezentuje się tak:
1. Tworzona jest klasa Error Handler'a
[php:1:af974e938b]<?php
$Error = new Error();
?>[/php:1:af974e938b]
2. Ustawiana jest metoda error handlera:
[php:1:af974e938b]<?php
set_error_handler(array($Error, '_errorHandler'));
?>[/php:1:af974e938b]
3. Błędy zbierane są za pomocą trigger_error i gromadzone za pośrednictwem metody _errorHandler (z klasy obsługi błędów ustawionej przez setErrorHandler()) we właściwościach klasy Error w postaci tablicy.

Problem polega na tym, że właściwości klasy zmienione za pośrednictwem metody, która zastapiła domyślnego error handlera wbudowane w php nie są mozliwe do odczytania z poza obiektu.
Jak się więc do nich dobrać z poza obiektu? Próbowałem coś zdziałać za pośrednictem referencji jednak bez powodzenie - może daje je tam gdzie nie trzeba. Problem wydaje mi się bardziej złożony i nie chodzi pewnie o referencje.

Pozdrawiam.
hawk
Trochę to dziwne bo atrytut obiektu to atrybut obiektu, w PHP4 zawsze można odczytać.
Chodzi o to, że nie masz dostępu do tego, co obiekt zapisał sobie w tablicy, czy też stworzył się "przy okazji" drugi obiekt Error?
rzseattle
Mialem podobny problem przy wsadzeniu funkcji parsujacych XML przedstawionych w manualu do obiektu (startElement() itd. ) . Gdy pobieralem wartosci zawarte w znacznikach do tablicy $this->values to nie moglem juz jej nigdzie odczytac , w samej metodzie dzialala (tzn szlo wyprintowac argumenty) ale poza nia byla pusta. Wygladalo na to ze parser zostal stworzony jako calkowicie inny obiekt niezalezny od mojego. Problemu niestety nierozwiazalem poniewaz potrzeba napisania parsera szybko sie rozwiala no ale pozostal na przyszlosc.
kwiateek
Cytat
Trochę to dziwne bo atrytut obiektu to atrybut obiektu, w PHP4 zawsze można odczytać.
Chodzi o to, że nie masz dostępu do tego, co obiekt zapisał sobie w tablicy, czy też stworzył się "przy okazji" drugi obiekt Error?

Właśnie to wgląda tak, że ustawienie error handlera powoduje zainicjalizowanie nowej instacji obiektu. W obiekcie mogę odczytywać atrybuty klasy poprzez np.:
[php:1:9d6b476d29]<?php
var_dump($this->_errorsList);
?>[/php:1:9d6b476d29]
ale już za obiektem użycie:
[php:1:9d6b476d29]<?php
var_dump($Error->_errorsList);
?>[/php:1:9d6b476d29]
zwraca mi samą pustą zmienną bez danych:
Cytat
array(0) { }

Cytat
A moze:
[php:1:9d6b476d29]<?php
set_error_handler(array(&$Error, '_errorHandler'));
?>[/php:1:9d6b476d29]

Tak już próbowałem wcześniej, bez powodzenia.

Pozdrawiam.
Ozzy
U siebie sprawdzałem i nie ma z tym problemu:
Kod
[errorBuffer:private] => Array ( [0] => Array ( [0] => NOTICE [1] => test [2] => D:WebServerwww*****3public_htmlindex.php [3] => 24

Metoda zwracająca tę tablicę też nie działa?
Jedyna różnica jaka rzuca mi się w oczy, to ta, że ja wywołuję
[php:1:e84c409fbb]<?php
set_error_handler(array($this, 'handle'));
?>[/php:1:e84c409fbb]
w konstruktorze.
Może Ty też spróbuj wewnątrz klasy?
kwiateek
Cytat
Metoda zwracająca tę tablicę też nie działa?

Próbowałem i za pomocą akcesora dostać się do tej właściwości klasy jednak podobnie jak wcześniej bez powodzenia.
Cytat
Może Ty też spróbuj wewnątrz klasy?

Spróbowałem... i?! Niestety nie działa )-;.
Jaką masz wersję php?

Pozdrawiam.
kwiateek
Cytat
kwiateek co za problem smile.gif tworzysz statyczna zmienna ktora przechowywac bedzie instancje

Zrobiłem tak:

W klasie między innymi metoda:[php:1:b88d9726ca]<?php
function &getInstance()
{
static $instance = null;

if ($instance == null) {
$instance = new Error();
}

return $instance;
}
?>[/php:1:b88d9726ca]
i poza klasą kod:
[php:1:b88d9726ca]<?php
$Error = &Error::getInstance();
set_error_handler(array(&$Error, '_handler'));
?>[/php:1:b88d9726ca]
Przy próbie pobrania właściwości klasy:
[php:1:b88d9726ca]<?php
var_dump($Error->_list);
?>[/php:1:b88d9726ca]
dalej mi zwraca pustą tablicę.
Cytat
jesli wystapi blad sprawdzasz czy instancja istnieje i tyle.

Nie rozumiem tego zdania. Możesz zaprezentować na przyładzie?

Pozdrawiam.
kwiateek
Rozwiązanie problemu okazało się banalne:
Aktualizacja do nowszej wersji php 4.3.5.

[OT]Ale jestem wkurzony bo zacząłem już podchodzić do tego problemu od innej strony.[/OT]

Pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.