Dziś jest wtorek, 2 grudnia 2008 roku (z kalendarza...)

Głupi błąd PHP

Icon

22.02.2006, 17:27

PHP

Komentarze (13)

Powrót

Wszystkie wersje PHP 5 od samego początku miały problem z wywołaniami include albo require w destruktorach. W wersji 5.0.3 prowadziło to nawet do wystąpienia "Segmentation fault". Zostało to jednak poprawione, co znaczy, że taka możliwość jest wewnątrz tych specyficznych metod dozwolona. Innym razem z kolei próba odwołania się z dołączonego pliku do pól/metod obiektu kończyła się zawieszeniem serwera. Sam na tym swego czasu poległem, pisząc OPT. Tymczasem to nie koniec problemów.

Spróbujcie w PHP 5.1.2 wewnątrz destruktora załączyć jakikolwiek plik z ./ albo ../ na początku, a później bez ścieżki lub ze ścieżką bezwzględną. Dwa ostatnie sposoby zadziałają, pierwszy - plik nie zostanie znaleziony. Co ciekawsze, po wyekspediowaniu tych linijek poza destruktor, wszystko zaczyna w magiczny sposób działać. Strasznie mnie ten błąd denerwuje, bo muszę stosować w skryptach jakieś chińskie kombinacje norweskie, aby załączyć np. konsolę debugową w najnowszym OPT albo OPD.

Błąd jest już zgłoszony, ale od paru dni jego status to cały czas "Open". Adres podałem w przypisach, załączony jest tam testowy kod źródłowy, który możecie sami sprawdzić. Pomnijcie też w sondzie bugtrackerowej, że to poważny problem (bo jest poważny), może się szybciej za niego wezmą.

Powrót

Przypisy:

Komentarze

Napisał P. Chmolowski w środę, 22 lutego 2006 o 20:14

Znając PHP-Team to jest prawdopodobne, że oleją i dostaniesz odp. w stylu: "Thank you for your time, but this is not a bug" :)

Napisał hwao w środę, 22 lutego 2006 o 22:26

Dokładnie, z tymi destruktorami to sie już różne rzeczy działy i dlatego staram sie ich unikać... za każdym w sumie razem "nie umiemy tego naprawic/to nie jest bug", no ale kliknać klikne ;)

Napisał shw w środę, 22 lutego 2006 o 22:49

zastanawia mnie po co mozna chciec uzywac include itp. w destruktorach czy w jakiejkolwiek metodzie..

Napisał mzweb w czwartek, 23 lutego 2006 o 07:32

Skoro to jest aż tak poważny błąd to zagłosowałem, ale ja tego typu rzeczy nie używam. Jeśli może to jakoś pomóc to nie ma problemu ;)

Napisał Zyx w czwartek, 23 lutego 2006 o 12:55

Jak widać, można chcieć. Ja np. chcę w destruktorach ładować kod konsoli debugowej umieszczony w osobnym pliku z prostego powodu: po kij ma się on walać razem z algorytmami, zwłaszcza że po uruchomieniu końcowej wersji projektu przestaje być potrzebny?

Napisał shw w czwartek, 23 lutego 2006 o 13:31

nadal nie widze problemu - a co za roznica czy wwalisz go na gorze pliku w ktorym z niego korzystasz czy w destruktorze - skoro jest potrzebny, to umiesc go na gorze, bo skoro uzywasz obiektu, to i tak zostanie on zaladowany, tyle ze w destruktorze.

Napisał Zyx w czwartek, 23 lutego 2006 o 15:54

Nie rozumiem za bardzo. Mam ładować konsolę debugową wraz z biblioteką bez względu na to, czy ktoś ją włączył, czy nie? Nie, tak być nie może. Jeżeli coś nie jest potrzebne, to nie jest nawet ładowane, bo i po co. Np. w takim OPT wydzieliłem plik opt.core.php, gdzie są rzadziej używane opcje. Jedną z nich jest konsola debugowa. Owszem, jest szansa, że jak ktoś sobie użyje jeszcze innej opcji, to w destruktorze ten plik będzie już załadowany, ale jeśli nie, to co? Nie ma nawet jak tego przechwycić, bo konsolę możesz sobie włączyć poprzez zwyczajne ustawienie wartości pola. Zresztą... sam fakt, że ty z tego nie korzystasz, nie oznacza, że błąd można zostawić. Każdy błąd, szczególnie w silniku PHP, powinien być usuwany bez względu na częstość używania danego elementu.

Napisał shw w piątek, 24 lutego 2006 o 00:42

juz chyba wiem na czym to polega - ladujesz ten plik warunkowo - teraz problem jest dla mnie widoczny.

Napisał Zyx w piątek, 24 lutego 2006 o 07:27

Exactly! :) To jest myśl przewodnia.

Napisał Denver w piątek, 24 lutego 2006 o 18:47

shw - możesz trochę rozjaśnić? Nie bardzo rozumiem co masz na myśli, a błąd faktycznie frustrujący.

Napisał hwao w sobotę, 25 lutego 2006 o 08:08

a nie mozesz zrobic podczas parsowania dokumentu:

if( $this->bDebug ) {
include './debug.php';
}



a potem w destruktorze tylko towrzysz sobie obiekt?

Napisał Zyx w sobotę, 25 lutego 2006 o 09:45

Konsola debugowa nie jest zrobiona obiektowa (po diabła tu OOP), ale mniej więcej tak właśnie teraz muszę robić.

Napisał hwao w sobotę, 25 lutego 2006 o 20:29

właduj w funckje... :)

Strona 1 z 1 :: 1

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2008 | Wykonanych zapytań: 2 | Serwer wirtualny zapewnia