Vývoj PHP v roce 2006

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

Sara Golemon shrnula vývoj kódu PHP v roce 2006 a já přináším krátké shrnutí tohoto shrnutí:

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

Diskuse

Messa:

Nebude safe_mode? Jak bude vyřešena otázka bezpečnosti (při přístupu k souborům apod.)?

ikona Jakub Vrána OpenID:

Lepší ochranu poskytuje open_basedir.

ikona spaze:

open_basedir poskytuje *jinou* ochranu, než safe mode.

Ondrej Ivanic:

Ano inu, inteligentnesiu. safe_mode bola nocna mora. Jediny chybajuci rozdiel (pre mna) je to ze mozno by bolo mat vhodne nieco ako exec_basedir...

jirka:

Výše uvádíte: "Direktivu open_basedir lze při běhu skriptu zpřísnit". Funkce ini_set() mi vrací původní nastavení. Mohl by jste mi, prosím, poradit?

ikona Jakub Vrána OpenID:

Tato funkčnost je k dispozici až v PHP 6.

Jan Tichý:

V kostce lehce nadneseně shrnuto, direktiva safe_mode nebude potřeba, protože většina nastavení bude v PHP 6 v defaultní nezměnitelné podobě ve své přísné podobě, takže PHP 6 se bude vždy chovat tak, jako by safe_mode bylo zapnuté, ovšem s důrazem na správné využití open_basedir.

ikona dgx:

> Z PHP 6 zmizely direktivy ... magic_quotes_*.

To bude mít docela zdrcující dopad na tento blog, že? :-))

ikona Jakub Vrána OpenID:

Pouze vyměním informaci v patičce za filter.default=magic_quotes.

ikona dgx:

Rýpu si, rýpu.

Není Jakube už načase se na magic_quotes skutečně vykašlat? V příkladech místo query("SELECT ... WHERE X = '$_GET[x]'") začít psát query("SELECT ... WHERE X = '$x'") atd... Mohl bys pak parametry ošetřovat pomocí strlen(), substr(), používat PDO, ... A hlavně: dalo by se s parametry dělat i něco trošku jiného, než je jen a pouze vkládat do SQL příkazu.

ikona Jakub Vrána OpenID:

Na <?php $x = mysql_real_escape_string($_GET["x"]); mysql_query("SELECT '$x'"); ?> přecházet nehodlám. Na vázání proměnných v podání PDO časem přejdu, ale asi ne na tomto blogu. Předělávat všechny příklady se mi nechce a mít je nekonzistentní taky ne.

rezna:

hmm ja nevim, vy pisete v PHP dlouuuuuho a za tu dobu jste si nenapsal rozumne funkce/tridy pro praci s SQL? :) - IMHO je zakladem rozumne psaneho projektu aspon fukce a la

DO_Query("SELECT * FROM table WHERE column = '@x@', array('x' => 'neco'))

minimalne toto zarucuje rozumne skladani SQLka, jeho prehlednost a hlavne jednotnou kontrolu nad vstupem

ikona Jakub Vrána OpenID:

Ano, vázání proměnných je dobrý koncept. Ale spíš než doma-upečené řešení mám raději nějaké standardní. Proto se mi líbí PDO.

rezna:

ja tohle psal uz pred PDO inspirovan tim co maji v .NETu - co jsem neresil je jeste typovani - to by tam byt melo - v .NETu lze elegantne tahle kontrolovat na parametrech i typy, pripadne si vynutit prevod

uzivatel:

Odporucam zabrusit do databazovej vrstvy frameworkov CodeIgniter alebo CakePHP, PDO sa dlho dobu v jednoduchosti urcite nechyti.

ikona Jakub Vrána OpenID:

Všechny příklady jsem předělal a blog nyní předpokládá vypnuté magic_quotes_gpc.

ikona v6ak:

Gratuluji!

ikona david@grudl.com:

Super! Kolik času ti to vzalo?

ikona Jakub Vrána OpenID:

Celkem 90 minut. Na to, že jsem se k tomu rozhoupával asi dva roky, to je docela málo :-).

L.:

Kdo proboha potřebuje goto??? A k čemu?

ikona Jakub Vrána OpenID:

Rozumně se dá použít např. k ošetřování chyb.

error414:

Sam vis ze PHP je jazyk kde se vetsina lidi uci programovat. Podle toho nektere scripty jsou tak hruzostrasne. GOTO zavede takove nove konvece ze se vtom nikdo nevyzna. To jsou moje vzpominky na Pascal a GOTO peklo.

Štěpán Svoboda:

JO!

Pod to bych se podepsal :)

Příklad:

<?php

class User
{
    private
    $Id,
    $Name,
    $Email;

    public function getId()
    {
        return $this->Id;
    }
    public function setId($Id)
    {
        $this->Id = $Id;
    }

    public function getName()
    {
        return $this->Name;
    }
    public function setName($Name)
    {
        $this->Name = $Name;
    }

    public function getEmail()
    {
        return $this->Email;
    }
    public function setEmail($Email)
    {
        $this->Email = $Email;
    }

    public function import($source = 'Row', $data = false)
    {
        switch ($source) {
            case 'Row': {
                if (!$data) {
                    if (!$this->getId()) {
                        throw new Exception('User::import() - Cannot import: no data, unknown Id');
                    }
                    else {
                        $conn = Connector::get();
                        $data = $conn->fetchRow("SELECT * FROM".tableUser." WHERE Id = {$this->getId()}");
                    }
                }
                $messages = array();
                try {
                    label%begin;
                    if (!array_key_exists('Id', $messages)) {
                        $this->setId(validate::Id($data['Id']));
                    }
                    if (!array_key_exists('Name', $messages)) {
                        $this->setName(validate::Name($data['Name']));
                    }
                    if (!array_key_exists('Email', $messages)) {
                        $this->setEmail(validate::$data['Email']);
                    }
                }
                catch (Exception $e) {
                    $messages['Id'] = $e->getMessage();
                    goto %begin;
                }
            }
        }
        $this->setId();
    }
}

?>

Štěpán Svoboda:

:)

místo toho co je v příkladu má být:
<?php

   
catch (Exception $e) {
                    $messages[$e->getProperty()] = $e->getMessage();
                    goto %begin;
                }

?>

museli bychom mít nadefinovanou nějakou jinou třídu vyjímek ale to už nesouvisí s problémem...

ikona Jakub Vrána OpenID:

Tohle se dá vyřešit pomocí

<?php
while (true) {
    try {
    } catch (Exception $e) {
        continue;
    }
    break;
}
?>

Štěpán Svoboda:

Tohle mne nenapadlo. Abych se přiznal tak s whilem nejsem moc dobrej kamarád :) Asi pzůstatek z Pascalu, který zde již někdo zmínil.

To error414: Prasácky se dá programovat s goto i bez něj...

rezna:

GOTO je silenost - a uz vubec ne k osetrovani chyb - k tomu je konstrukce try{}catch{} a cykly

jak je videt vyvojari jsou celkem mimo - radsi kdyby tam cpali rozumny veci

ikona Jakub Vrána OpenID:

Vývojáři jsou možná z tvého pohledu mimo, ale třeba psaní parseru s důrazem na výkon je s konstrukcí goto mnohem elegantnější a try-catch v tom nijak nepomůže.

Nicméně souhlasím, že se goto bude častěji spíše zneužívat, proto je jeho funkčnost také značně omezena.

Honca:

Chci se zeptat, jestli je někde možný (nebo bude možný) sehnat zdrojový kódy standardních funkcí v PHP...

ikona Jakub Vrána OpenID:

Např. http://cvs.php.net/php-src/ext/

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 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.