Parametry předávané referencí

Školení, která pořádám

Jako parametr předávaný referencí je podle dokumentace možné předat tři různé hodnoty: proměnné, nově vytvořené objekty a výsledky funkcí vracejících referenci. Před PHP 4.4.0 a PHP 5.0.5 se to důsledně nekontrolovalo a bylo možné předat např. i výsledek funkce, která referenci nevrací. Za určitých okolností to ale vedlo k neoprávněným přístupům do paměti a následným pádům aplikace. Vývojáři PHP se rozhodli tento nedokumentovaný způsob postupně zakázat – ve větvi 4.4 se na něj upozorňuje chybami typu E_NOTICE, ve větvi 5.1 potom fatálními E_ERROR. Nevím, jestli by se současnými vnitřnostmi PHP bylo možné nedokumentovaný způsob volání povolit, každopádně vývojáři si celkem logicky řekli, že pokud funkce přebírá parametr referencí, měl by volajícího zajímat výsledek a částečně i díky tomu zvolili cestu postupného zakázání tohoto volání. U funkcí jako asort to dává dobrý smysl, u funkcí typu current, kde nás zajímá především návratová hodnota, už to mírně pokulhává.

Co mi ale přijde nejhorší – spousta lidí žijících v domnění, že PHP rozumí, je najednou překvapena, když zjistí, že jejich kód je celou dobu špatně. V dokumentaci je od prosince 2000 jasně řečeno, že jiné způsoby předávání parametrů referencí mají nedefinované chování. PHP tak podle mě zase jednou doplatilo na to, že bylo vůči uživatelům příliš tolerantní.

Jakub Vrána, Ze zákulisí, 21.9.2005, diskuse: 3 (nové: 0)

Diskuse

ikona llook:

Myslím, že svůj díl viny nese i to, že ještě někdy v roce 2004 nebyly v manuálu rozpoznatelné parametry předávané referencí.

ikona Jakub Vrána OpenID:

Ano, to památné datum bylo 3.8.2004, kdy jsem indikaci parametrů předávaných referencí k většině funkcí doplnil ;-).

Michal Molhanec:

a proč vlastně přebírá current() parametr odkazem? podle toho odkazu do PHP Dev konference bude u current ten parametr upraven aby odkaz nebral ?!?

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.