PHP Internals

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

Protože mě zajímá, jakým směrem se PHP vyvíjí, sleduji konferenci PHP Internals. V poslední době se např. probíralo, jestli bude v PHP operátor goto (srpen 2004, asi 200 zpráv), jestli se zjednoduší práce s neinicializovanými proměnnými a jak se to bude dělat (červenec 2004, asi 100 zpráv) nebo jak se bude přistupovat k databázím (naposledy únor 2005, asi 40 zpráv).

Do konference většinou nepřispívám, protože na vývoji kódu PHP se přímo nepodílím a zprávy ostatních lidí, kteří si myslí, že mají patent na rozum, diskuse obvykle pouze znehodnocují. Z tohoto důvodu bohužel např. nevím, jak to dopadlo s operátorem goto, protože po asi padesáti zprávách tohoto druhu jsem diskusi přestal sledovat. Pro lidi s nedostatkem času proto vychází i PHP Weekly Summary, kde jsou probíraná témata jednak stručně popsána a jednak i celkem trefně komentována – viz např. shrnutí operátoru goto. Tento přehled má ale oproti skutečnému dění bohužel obvykle dost velké zpoždění.

Co si o goto myslím já? V rukou experta by jistě mohl přispět ke zpřehlednění a zelegantnění kódu, ale v rukou nováčka by mohl způsobit nedozírné škody. Proto jsem spíš toho názoru, že v tak rozšířeném jazyce, jako je PHP, bude lepší se bez něj obejít.

Speciální konstrukce pro práci s neinicializovanými proměnnými by PHP podle mě prospěla jako sůl, porovnejte např. následující kód:

<?php
// současná verze
echo '<input name="search" value="' . (isset($_GET["search"]) ? htmlspecialchars($_GET["search"]) : "") . '" />';

// s novou konstrukcí
echo '<input name="search" value="' . htmlspecialchars(ifnull($_GET["search"], "")) . '" />';
?>

U této konstrukce se vše pokud vím zaseklo hlavně na vybrání správného názvu. Někdo navrhuje ifnull, někdo ifsetor (to myslím nakonec vyhraje), někdo coallesce. Podle mě to je jedno, hlavně ať už něco je – nejlepší se mi zdá ifnull, někdo ale poukazuje na drobné odchylky od IFNULL známého z databází.

Cris přišel s řešením, jak funkci ifsetor implementovat v user-landu:

<?php
function ifsetor(&$var, $default = null) {
    return (isset($var) ? $var : $default);
}

$var = ifsetor($_GET["var"], "");
?>

Tato funkce má dvě drobné nevýhody: pokud je druhý parametr volání funkce, zavolá se tato funkce, ať je proměnná nastavená nebo ne, a předávaný parametr (v ukázce $_GET["var"]), který nebyl v době volání nastaven, bude mít po zavolání funkce hodnotu null. Myslím, že když o těchto nedostatcích člověk ví, dá se s nimi žít.

Co se jednotného přístupu k databázím týče, jsem zvědav na PHP 5.1.0, k němuž by mělo být přiloženo rozšíření PDO. Nejedná se o projekt snažící se obsáhnout všechny možné konstrukce různých databází do jednoho funkčního rozhraní jako je např. ADOdb nebo PEAR DB, jedná se naopak o nízkoúrovňový přístup k databázím s ambicí nahradit většinu extenzí jako MySQL nebo SQLite, kde bude implementována pouze základní množina funkcí a u jednotlivých databází ty pro ně specifické. Protože nemám rád molochy, tak jsem zvědav, jestli se PDO ujme.

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

Diskuse

Tomáš:

Mě se i
<?php
echo '<input name="search" value="' . htmlspecialchars(ifnull($_GET["search"], "")) . '" />';
?>
zdá moc složíté, já bych si všechno raději nejdříve projel v nějakém cyklu a do formuláře pak už jen vložil hodnotu.

Adam Hošek:

AD Neinicializované proměnné - Jsem pro, aby v PHP nějaká fce jako ifnull byla. Ovšem není zase takový problém si jí napsat sám. Dokonce (myslím) není problém napsat si nějaké fce/třídy na cyklický průchod hodnot z $_GET.

tark:

Moc příjemný není ani to s tím ifnull... Co takhle tohle?

<?php
echo '<input ... value="'.htmlspecialchars(getVar('search')).'" />';
?>

Lweek:

Mě přijde nesmyslné prohnat prázdný řetězec skrze htmlspecialchars :)

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.