Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

dnes nový podtitulek!

PHP Surprise

Článek upozorňuje na smutný fakt, že i v nových verzích PHP se umí objevit chyba, díky kterým přestanou fungovat základní jazykové konstrukce a funkce.

PHP je jazyk plný překvapení. Takové Kinder Surprise pro dospělé programátory. Psaní aplikací v PHP je adrenalinovým sportem – i pojišťovny k tomu tak přistupují.

Naivní prosťáček nebo PHP laik by při pohledu na tento kód…

$arr = array();
$arr['XB@'] = 'La';
$arr[2089710047] = 'Trine';

unset($arr['XB@']);

// hádejte - co se vypíše?
print_r($arr);

…mohl mít pocit, že ví, co se vypíše. Ale ostřílený profesionál by nejprve kontroval otázkou: „V jaké verzi PHP?“ A rozhodně by se nespokojil s odpovědí „V pětce.“ Když se ptá na verzi, zajímá ho každá setinka. Protože třeba PHP 5.1.2 odstraní (unset) z pole jiný prvek, než verze 5.1.3. Stejně tak 4.4.2 versus 4.4.3.

To je péhápé. To se ví!

V aplikacích psaných pod PHP nestačí neuvádět minimální požadovanou verzi, vhodnější je zmínit výčet verzí, pod kterými dost možná i funguje. Třeba pokud používáte overloading…

class OverloadTest
{
    private $arr;

    public function __set($name, $value)
    {
        $this->arr[$name] = $value;
    }

    public function &__get($name)
    {
        return $this->arr[$name];
    }
}

$test = new OverloadTest();
$test->a['x'] = 'item';

…tak vězte, že nemusí korektně fungovat v PHP 5.2.0. Nicméně v předchozích i následujících verzích ano. Obzvláště pikantní je, že overloading miluje Zend Framework, takže kupříkladu jejich Zend_Session je pětdvanulkou taktéž ochromen. Doporučují upgradovat na 5.2.1, ovšem ani to nemusí být gór dobrý nápad. Proč?

Procházíte ve své aplikaci pole pomocí foreach a používáte funkci key? Pak vám nemusí fungovat v PHP 5.2.1 a novějších. Přitom v minulosti z podobných důvodů nefungovalo třeba Texy v PHP 4.4.1. Historie se opakuje.

Simply PHP

Programovat v Javě umí kdekdo. O ASP.NET ani nemluvě. Jen v PHP píši skuteční hrdinové. Renesanční bytosti. Fascinující a neskutečně trpěliví lidé. Trpěliví od slova trpět.

Třeba já.

Karma body: 22. Líbil se vám článek?

Komentáře » přidat

  1. avatar [1] roman: nový

    Co sa tyka toho foreach.. pokial som dobre cital problem sa vyskytne ked clovek predtym nespravi reset(). Nuz ale su aj ludia (ako ja trebars) co reset pouzivaju vzdy. Vlastne aj php kod vzdy zacinam <?php …

    Posláno 25. 8. 2007 v 15.04 | Odpovědět
  2. avatar [2] Roman Šitina: nový

    mohl bych poprosit o ukázku toho, co se stane v prvním případě v různých verzích? kde jsem měl možnost vyzkoušet, tam jsem dostal očekávaný výsledek :(

    Posláno 26. 8. 2007 v 8.12 | Odpovědět
    Na komentář reagoval [4] David Grudl
  3. [3] error414: nový
    public function &__get($name)

    to je chybka nebo neco co neznam?

    Posláno 26. 8. 2007 ve 14.56 | Odpovědět
    Na komentář reagoval [4] David Grudl
  4. avatar [4] David Grudl: nový

    [2] Roman Šitina: V PHP < 5.1.3 volání unset($arr['XB@']) odstraní z pole prvek $arr[2089710047].

    [3] error414: To je nutné k tomu, abys mohl přes overloading používat pole. Protože volání $test->a['x'] = ... se provede cca jako:

    $tmp = $test->__get('a');
    $tmp['x'] = ...;
    unset($tmp);

    a bez reference by se modifikovala jen pomocná proměnná, takže by volání nemělo žádný efekt.

    Posláno 26. 8. 2007 v 16.15 | Odpovědět
  5. [5] noname: nový

    no ale v čem jiném? předpokládejme že potřebujeme zcela standardní záležitost typu /hezke-adresy a jak v JSP (apache-tomcat) tak v ASP.NET (asp apache) jsou vopruz, odstranění třeba jsessid z adresy na tomcatu téměř nemožné, microsoftí technologie na serveru ee, tak nám možnosti ubývají. Notabene když potřebujeme něco hodně dokumentovaného s hodně příklady / připravenými třídami atd.
    Je jasné, že se v nějaké setinkové verzi může objevit nějaká podobná funkční chyba, ale to asi v jakémkoliv systému podobného rozsahu. Problematické kódy ale nejsou tak rozšířené, známý nedávno updatoval hosting s historickou 4.1.x verzí na poslední 5.něco, na hostingu bylo několik set prezentací od několika set programátorů a problém byl jen na jedné. Mě spíše na php štvou různé nekonzistence v názvech funkcí, a myslím, že 99 % php programátorů se také s takovými problémy nesetká. Nicméně tím nijak nechci naznačit, že informační hodnota článku není velká pro to 1 % ostatních

    Posláno 27. 8. 2007 ve 21.19 | Odpovědět
    Na komentář reagoval [6] Věroš
  6. avatar [6] Věroš: nový

    Skoro se vkrádá myšlenka: To nemají v Zendu nějaké regresní testy, které by podobné problémy vychytaly? Chápu, že se to stane jednou, ale dvakrát? Nebo ty dvě problémové verze (4 a 5) vyšly najednou?

    [5] noname: Pokud si člověk sám hostuje, tak to není až takový problém  – nějakou automatizovanou sadu testů pro ověření funkčnosti webu není před migrací problém udělat.

    Hůř je na tm správce hostingového serveru, který nemá možnost ověřit, že těch milión webů po upgradu funguje OK. Nakonec jsme to řešili instalací nového serveru s PHP5.

    [5] noname: jedna z nevýhod Javových technologií vidím v tom, že jsou hodně ukecané (např. mapování URL → servlety, XML je přece jenom pro stroje a ne pro lidi).

    Zkus Python: Jen se pro Python nedostávají programátoři tak lehce jako pro PHP (ale zase jsou o to kvalitnější :-) ) Pokud máš vlastní servery tak hosting je dokonce příjemnější než PHP :-)

    A dokonce už neexistuje taková džungle frameworků pro web jako před pár lety.

    Posláno 28. 8. 2007 v 10.40 | Odpovědět
    Na komentář reagoval [7] LLook
  7. avatar [7] LLook: nový

    [6] Věroš: Nějaké mají: http://gcov.php.net/ Akorát jejich coverage reporty jsou bohužel tak trochu laděné do červena…

    Posláno 28. 8. 2007 ve 12.00 | Odpovědět

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře ani hlasovat

Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

La Trine © 2004, 2008 David Grudl – o webu
provozuje Pachollini.

Jakékoliv užití obsahu, včetně převzetí článků nebo jejich částí, je bez předchozího písemného svolení autora zakázáno.

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.