Na navigaci | Klávesové zkratky

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á.

Komentáře

  1. roman #1

    avatar

    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 …

    před 17 lety
  2. Roman Šitina #2

    avatar

    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 :(

    před 17 lety | reagoval [4] David Grudl
  3. error414 #3

    public function &__get($name)

    to je chybka nebo neco co neznam?

    před 17 lety | reagoval [4] David Grudl
  4. David Grudl #4

    avatar

    #2 Romane Šitino, 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.

    před 17 lety
  5. noname #5

    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

    před 17 lety | reagoval [6] Věroš [6] Věroš
  6. Věroš #6

    avatar

    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.

    před 17 lety | reagoval [7] LLook
  7. LLook #7

    avatar

    #6 Věroši, Nějaké mají: https://web.archive.org/….php.net:80/ Akorát jejich coverage reporty jsou bohužel tak trochu laděné do červena…

    před 17 lety

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


phpFashion © 2004, 2024 David Grudl | o blogu

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