15 komentářů k článku Jaké novinky přinese PHP 7.1:

  1. v6ak

    Příklad na array destructuring
    Takovou věc nepoužívám často, ale pokud chci parsovat tabulku třeba v CSV, je to na to jak dělané. Většinou to nedělám v PHP, ale to už je detail, i jiné jazyky mají podobné (a někdy i mocnější) konstrukce.

    Další věc, kde se to může hodit, je parkování pomocí regulárních výrazů.

    1. Martin HujerAutor příspěvku

      Re: Příklad na array destructuring
      Pokud jde o jednorázový import CSV, tak je to asi v pohodě. Ale v případě, že to je nějaký univerzálnější import, tak je podle mě lepší mít v prvním řádku pojmenované názvy sloupců a nespoléhat na pořadí (pokud se to bude parsovat podle klíčů, tak je přidání dalšího sloupce méně práce a méně náchylné na rozbití).

      Když jsem posledně parsoval CSV, tak jsem použil CSV knihovnu od PHP league a bylo to úplně bez starostí :-)

  2. dimov-cz

    list()
    list() pouziju malokdy, ale u nejakych jednodussich specifickych skriptu se mi obcas hodi u vysledku internich php funkci. Napr:

    1. list($id, $date, $time) = explode(‚-‚, $line);
    2. preg_match_all(…,$matches);
      list($full, $id, $date, $time) = $matches;

    Mozna existuji lepsi cesty, necham si poradit

    1. tomasfejfar

      Re: list()
      To první je náchylné na chyby kdy line bude ‚one-two‘. Tipuju, že to neošetřuješ, narozdíl od if (count($explodedLine) !== 3) { //exception }

    2. Martin HujerAutor příspěvku

      Re: list()
      U těch regulárních výrazů ten list() přidává zbytečnou křehkost do budoucna. V situaci, kdy bude potřeba matchnout a vrátit ještě nějakou hodnotu mezi těmi stávajícími, tak se to bude muset celé posunout (a tam hrozí zbytečná chyba – klidně to může upravovat jiný vývojář). Dobře to řeší ty pojmenované segmenty (viz komentář od Jakuba Vrány níže).

  3. Jakub Vrána

    list()
    list používám na dvě věci:

    1. Přiřazení matchnutých částí regulárního výrazu do proměnných. Toho se dá zbavit používáním (?P<name>).
    2. Přiřazení parametrů příkazového řádku do proměnných. Toho se dá zbavit používáním pojmenovaných parametrů místo pozičních a knihovnou getopt.
  4. Jakub Vrána

    Hashování session proměnných
    Odstranění session.hash_function škoda není. Nikdy jsem ale nepochopil, proč PHP na serveru neukládá jen hash session ID. Pokud někdo získá read-only přístup k úložišti session ze serveru (může to být třeba jen mirror), tak se rázem může vydávat za jakéhokoliv uživatele. Když by se na serveru ukládal jen hash session ID, tak by se to stát nemohlo. Dohledání dat podle daného session ID by ale pořád bylo možné. Viz též tip 883 v mé knize 1001 tipů a triků pro PHP, který to řeší.

  5. tacoberu

    array destructuring
    Já to používám u návratových hodnot funkcí:

    /**
     * @return [array, array]
     */
    function fetch() {}
    list($blocked, $other) = fetch()
    

    Samozřejmě by to šlo i tím, že vrátím strukturu, ale ve výsledku je to zbytečně ukecané a rozdíl nulovej.

    Samozřejmě musím mět zaručeno, že mi ta funkce bude vracet to co slibuje. Což je imho opět žádoucí, ať laskavě dělá svou práci pořádně, nebudu to za ní kontrolovat.

    1. tomasfejfar

      Re: array destructuring
      No a myšlenka je, že protože to nechceš kontrolovat, tak to uvedeš v kontraktu – co chceš, aby vrátila. A protože v PHP není jednoúčelový struct, tak musíš udělat celou třídu, případně interface+anonymní třídu.

      1. tacoberu

        Re: array destructuring
        Ano, to chápu. Jen se rozcházíme v užitku toho. Mě se zdá, že ve výsledku snaha o něco takového povede k mnohem většímu code-smell, než kterému se chceš vyvarovat.

        1. Martin HujerAutor příspěvku

          Re: array destructuring
          Obecně se snažím zabránit zbytečným chybám (ať bych ji udělal já nebo jiný vývojář), takže jakákoliv další automatická kontrola je super. A vracení konkrétního typu místo pole zajistí, že v tom chybu udělat nejde. A kromě toho vracení definovaných typů také pomůže statické analýze lepšímu napovídání v IDE.

          (Dříve mi to také přišlo jako „zbytečná práce“ a „budeme mít zbytečně moc tříd“. Abych to bral jako nezbytnou věc, stačilo, když to několikrát zabránilo chybě nebo překlepu)

  6. tacoberu

    array destructuring jinde
    Je zajímavé, že třeba v Haskellu se to používá hodně, páč pattern-matching, a je to hodně pohodlené. Chyby si tam hlídá typový systém.

    V Lue, tam zase případ, když bych udělal něco jako list($a, $b, $c) = [1, 2]; tak v $c bude prostě Null. U ní jde zase o to, že Lua má velice čistá pravidla jak se pracuje s Null (respektive dle její terminologie Nil) hodnotama.

    Já bych to za code-smell určitě nepovažoval.

    1. Martin HujerAutor příspěvku

      Re: Hruza
      Nene, $$a zůstává (naštěstí?):

      <?php
      $a = 'b';
      $$a = 'c';
      
      var_dump($b); // string(1) "c" i v PHP 7.1
      

      Zrušili jen možnost to použít pro přepsání $this.

Napsat komentář

Tato diskuse je již příliš stará, pravděpodobně již vám nikdo neodpoví. Pokud se chcete na něco zeptat, použijte diskusní server Devel.cz

Zdroj: https://www.zdrojak.cz/?p=18941