Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

PHP 5.4 přináší změny a nové jazykové konstrukce

Vyšlo PHP 5.4.0, a i když je zatím ve verzi alpha, podíváme se na novinky v tomto jazyce, na nové konstrukce, odstraněné konstrukce a další změny, kterých sice není tolik jako ve verzi 5.3, ale jsou zajímavé. Změny pro čtenáře Zdrojáku sumarizoval a okomentoval Jakub Vrána.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

PHP 5.4 nepřinese tolik novinek jako PHP 5.3, změny mi ale povětšinou dělají radost.

Odstranění zastaralých obratů

PHP 5.3 označilo řadu obratů jako zastaralých, takže jejich odstranění z PHP 5.4 není žádným překvapením. Co zmizelo?

  1. Konstrukce break $var;
  2. Konfigurační direktiva safe_mode a související
  3. Konfigurační direktivy register_globals a register_long_arrays
  4. Konfigurační direktiva allow_call_time_pass_reference
  5. Konfigurační direktiva highlight.bg
  6. Konfigurační direktivy session.bug_compat_42 a session.bug_compat_warn
  7. Konfigurační direktiva y2k_compliance
  8. Funkce session_is_registered, session_register a session_unregister
  9. Funkce import_request_variables
  10. Funkce define_syslog_variables a stejnojmenná konfigurační direktiva

Žádný z těchto obratů už léta nepoužívám, takže jejich odstranění vítám, protože do budoucna umožní zjednodušení aplikací nebo snížení nároků na jejich konfiguraci. Konfigurační direktivy magic_quotes_gpc a magic_quotes_runtime kupodivu přežily, i když pro první jmenovanou existuje náhrada na úrovni konfigurace a druhá se prakticky nikdy nepoužívala.

Bez náhrady zdá se zmizela i užitečná direktiva  safe_mode_exec_dir.

Nové vlastnosti

  • $_SERVER['REQUEST_TIME'] nově obsahuje i mikročas (dříve jen čas s přesností na sekundy).
  • Výchozí hodnota konfigurační direktivy default_charset v dodávaném php.ini je UTF-8 (dříve  ISO-8859-1).
  • array_combine(array(), array()) vrací array() (dříve false).
  • Třetí parametr funkce preg_match_all je nepovinný. To se hodí pro zjištění počtu výskytů regulárního výrazu.
  • $a = null; $a->a = 1; nyní vyvolá varování (dříve potichu prošlo).
  • <?= funguje nezávisle na nastavení short_open_tag.
  • Podpora nepřímého volání metod: $f = array($obj, 'method'); $f();.
  • Přístup k prvku pole vráceného funkcí: f()[0].
  • Možnost použít $this uvnitř anonymních funkcí (netřeba uvádět v  use).
  • Možnost zpracovat zdrojáky ve vícebajtovém kódování pomocí zend.multibyte (bohužel zatím není povoleno ve verzi pro Windows).
  • Funkce http_response_code vracející momentální HTTP status.
  • Funkce header_register_callback dovoluje zaregistrovat callback zavolaný těsně před posláním hlaviček.
  • Parametr $limit u funkcí debug_backtrace a debug_print_backtrace.
  • Smysl konstrukce $string[1][0] mi sice uniká, ale aspoň už nevyvolá chybu.
  • Některé funkce dříve specifické pro Apache jsou nyní k dispozici i pod FastCGI.
  • Funkce number_format už dokáže zpracovat i delší oddělovače desetin a tisíců. To dovoluje použít vícebajtové kódování (např. pevnou mezeru v UTF-8) a HTML entity (např.  &nbsp;).
  • Funkce hex2bin($data) (jako protiklad k bin2hex) je funkčně totožná s  pack("H*", $data).

I v této části jde převážně o čištění jazyka a se změnami souhlasím. Mírně kontroverzní může být <?=, XML validita PHP skriptů ale stejně zaručena nikdy nebyla i při vypnutém short_open_tag (např. kód <?php echo "?><"; ?> je platný PHP skript, ale neplatný XML fragment).

Za zásadní změnu považuji zavedení konstrukce f()[0], která byla dlouho požadovaná a stejně dlouho odmítaná např. z důvodů horší čitelnosti. Možná se také ptáte, k čemu je z funkce vracet pole a použít z něj jediný prvek? Mně by se to kdysi hodilo v NotORM, kde byla původně metoda group dovolující provést třeba i více agregačních funkcí najednou: list($min_id, $max_id) = $table->group("MIN(id), MAX(id)"). Bohužel se ale neobešla bez dočasné proměnné ani v nejběžnějším případě, kdy se volala jen jedna agregační funkce. S PHP 5.4 by to šlo: $table->group("MIN(id)")["MIN(id)"]. Nové API $table->min("id") je ale stejně přehlednější.

Traits

Asi největší novinkou v PHP 5.4 je podpora takzvaných traits. Ty dovolují zmírnit nevýhody jednonásobné dědičnosti tím, že do třídy umožňují vložit definice metod ze společného zdroje nezávislého na dědičnosti. Hodí se to v situaci, kdy chci mít stejnou funkčnost ve více třídách bez společného rodiče. Někdy se to dá vyřešit pomocí metody  __call:

class C {
    public $common;
    function __call($name, $args) {
        if (method_exists($this->common, $name)) {
            return call_user_func_array(array($this->common, $name), $args);
        }
        trigger_error("Call to undefined method " . __CLASS__ . "::$name()", E_USER_ERROR);
    }
}

Zdaleka to ale nejde vždy, např. při implementaci rozhraní s tímto přístupem nepochodíme, protože tam musí být metody definované přímo. Pak nezbývá nic jiného, než je ve třídě všechny potupně zopakovat. PHP 5.4 řeší tento problém pomocí tzv. horizontal reuse:

trait T {
    function getIterator() {
        echo "T::getIterator()\n";
        return new ArrayIterator($this->data);
    }
}

class C implements IteratorAggregate {
    public $data = array();
    use T;
}

$c = new C;
var_dump($c instanceof T); // bool(false)
foreach ($c as $val) { // T::getIterator()
}

Změnu považuji za největší i proto, že přidává nové klíčové slovo. Možnosti jsou ještě širší, především lze definovat řešení kolizí. Zatím je funkčnost popsaná v RFC, píše se ale už i dokumentace.

Jsem zvědav, který framework začne traits využívat jako první. A také který dokumentační nástroj a které IDE se s touto novou vlastností dokáže se ctí vypořádat.

Zákaz změny parametrů u abstraktních konstruktorů

Poměrně zásadní zpětně nekompatibilní změna se týká sjednocení chování při dědění abstraktních konstruktorů s ostatními metodami. Jde o to, že když v potomkovi definujeme abstraktní metodu, musíme zachovat její parametry (můžeme jim přidat výchozí hodnotu, můžeme přidat další parametry s výchozí hodnotou, ale nemůžeme parametry odebrat nebo jim změnit typ):

abstract class A {
    abstract function __construct($a);
}
class C extends A {
    function __construct() {
    }
}
// v PHP < 5.4 prošlo, nově vyvolá
// Fatal error: Declaration of C::__construct() must be compatible with that of A::__construct()

Na konstruktory se toto omezení nevztahovalo, což nová verze opravuje (a tím zároveň sjednocuje chování s deklarováním konstruktoru pomocí rozhraní). Tento obrat se přitom občas používal, do dokumentace první alpha verze se ale popis této změny bohužel nedostal.

Informace o průběhu uploadu souborů

Už delší dobu se dají informace o průběhu nahrávání souborů od uživatele zobrazovat pomocí extenze APC. Nově to jde i jen pomocí session proměnných. Vzniklo k tomu několik konfiguračních direktiv začínajících na session.upload_progress., pomocí kterých se dá chování ovlivnit.

Pokud je sledování průběhu nahrávání povoleno, tak už stačí jen metodou POST poslat pole s názvem ini_get("session.upload_progress.name"). To způsobí vytvoření proměnné $_SESSION[ini_get("session.upload_progress.prefix") . $_POST[ini_get("session.upload_progress.name")]], která bude obsahovat pole se všemi dostupnými informacemi. Detailně to rozebírá příklad.

Změny v extenzích

V extenzi JSON, která je v poslední době velmi populární, je změn více:

Změny příkazové řádky

  • Přibyla volba --rz poskytující informace o Zend extenzích (obdoba třídy  ReflectionZendExtension).
  • Dále vznikly konfigurační direktivy cli.pagercli.prompt.
  • interaktivním režimu by také mělo fungovat nastavování konfiguračních direktiv pomocí #inisetting=value, platí to ale jen při práci přes Readline.

Další novinky

Kromě těchto změn, které jsou důležité při vytváření aplikací, došlo také k řadě vylepšení ve výkonnosti a paměťové náročnosti PHP. V méně používaných extenzích došlo k několika dalším změnám, které tento článek nepopisuje.

Co mi ještě chybí

Když už lze volat f()[], tak bych také ocenil obrat (new C)->f(), který by se hodil u fluent interface. Nemožnost pracovat s výsledkem operátoru new se dá různými způsoby obejít, je to ale značně krkolomné:

// první možnost
function identity($x) {
    return $x;
}
identity(new C)->f();

// druhá možnost
class C {
    static function create() {
        return new self;
    }
}
C::create()->f();

Této vlastnosti bychom se v PHP 5.4 měli ještě dočkat.

Občas by se mi také hodilo deklarovat návratový typ metod. Užitečné by to bylo hlavně u dědičnosti, kdy by se dalo odvozeným třídám přikázat, aby vracely stejný typ objektu. Této změny se podle mě zatím nedočkáme.

Závěr

Vydaná alpha na mě působí celkem vyzrálým dojmem. Pár chyb se sice již objevilo, ale věřím, že nebudou nijak závažné a další vývojová verze vyjde poměrně brzy. Změny na mě také působí poměrně uceleným dojmem, takže si myslím, že příliš dalších novinek se v PHP 5.4.0 už neobjeví.

Jakub Vrána

Autor se živí programováním v PHP, podílí se na oficiální dokumentaci, vyučuje na MFF UK a vede odborná školení. Poznámky si zapisuje na weblog PHP triky.

Školení Google Analytics pro pokročilé

DW - Školení Google Analytics
  • Jak využít nové funkce Google Analytics
  • Vyhodnocování kampaní díky používání Multichannel funnels
  • Kde návštěvníci vašeho webu utíkají z objednávacího procesu.
  • Nebudete opakovat časté chyby při vyhodnocování dat o návštěvnosti.

Detailní informace o školení Google Analytics pro pokročilé »

Přehled názorů

safe mode
lol 4. 7. 2011 04:18
Nový
├ 
Re: safe mode
rooobertek 4. 7. 2011 08:25
Nový
│
└ 
Re: safe mode
hugo 4. 7. 2011 15:01
Nový
│
 
└ 
Re: safe mode
Jakub Vrána 4. 7. 2011 15:35
Nový
│
 
 
├ 
Re: safe mode
Hugo 4. 7. 2011 15:54
Nový
│
 
 
│
└ 
Re: safe mode
Jakub Vrána 4. 7. 2011 16:20
Nový
│
 
 
└ 
Re: safe mode
Leoš 7. 7. 2011 11:36
Nový
│
 
 
 
└ 
Re: safe mode
maryo 7. 7. 2011 14:09
Nový
└ 
Re: safe mode
Jakub Vrána 4. 7. 2011 10:44
Nový
Re: PHP 5.4 přináší změny a nové jazykové konstrukce
Filip Procházka 4. 7. 2011 09:03
Nový
├ 
Re: PHP 5.4 přináší změny a nové jazykové konstrukce
Andrew 4. 7. 2011 09:09
Nový
│
└ 
Re: PHP 5.4 přináší změny a nové jazykové konstrukce
Filip Procházka 4. 7. 2011 09:25
Nový
└ 
Re: PHP 5.4 přináší změny a nové jazykové konstrukce
Jakub Vrána 4. 7. 2011 11:00
Nový
Re: PHP 5.4 přináší změny a nové jazykové konstrukce
kukulich 4. 7. 2011 09:14
Nový
└ 
Re: PHP 5.4 přináší změny a nové jazykové konstrukce
Jakub Vrána 4. 7. 2011 12:36
Nový
 
├ 
Re: PHP 5.4 přináší změny a nové jazykové konstrukce
notnotorm 4. 7. 2011 17:40
Nový
 
└ 
Re: PHP 5.4 přináší změny a nové jazykové konstrukce
adrive 4. 7. 2011 20:48
Nový
$this v closure
Proki 4. 7. 2011 09:52
Nový
Argh!
Jahudka 4. 7. 2011 10:25
Nový
├ 
Re: Argh!
jlx 4. 7. 2011 10:54
Nový
│
└ 
Re: Argh!
blizz 5. 7. 2011 15:53
Nový
│
 
├ 
Re: Argh!
blizz 5. 7. 2011 15:57
Nový
│
 
└ 
Re: Argh!
Oldis 5. 7. 2011 17:34
Nový
│
 
 
└ 
Re: Argh!
blizz 5. 7. 2011 19:46
Nový
│
 
 
 
└ 
Re: Argh!
Franta Kučera 5. 7. 2011 21:20
Nový
│
 
 
 
 
├ 
Re: Argh!
blizz 5. 7. 2011 22:12
Nový
│
 
 
 
 
├ 
Re: Argh!
mrj 5. 7. 2011 22:13
Nový
│
 
 
 
 
└ 
Re: Argh!
Zdenek 6. 7. 2011 10:15
Nový
│
 
 
 
 
 
└ 
Re: Argh!
Franta Kučera 6. 7. 2011 10:45
Nový
│
 
 
 
 
 
 
├ 
Re: Argh!
Oldis 6. 7. 2011 14:54
Nový
│
 
 
 
 
 
 
└ 
Re: Argh!
blizz 7. 7. 2011 04:28
Nový
│
 
 
 
 
 
 
 
└ 
Re: Argh!
Oldis 7. 7. 2011 17:15
Nový
│
 
 
 
 
 
 
 
 
└ 
Re: Argh!
blizz 7. 7. 2011 18:16
Nový
│
 
 
 
 
 
 
 
 
 
└ 
Re: Argh!
Oldis 7. 7. 2011 21:36
Nový
│
 
 
 
 
 
 
 
 
 
 
└ 
Re: Argh!
blizz 8. 7. 2011 10:00
Nový
├ 
Re: Argh!
Jakub Vrána 4. 7. 2011 11:31
Nový
│
└ 
Re: Argh!
Jahudka 4. 7. 2011 12:43
Nový
│
 
└ 
Re: Argh!
Jakub Vrána 4. 7. 2011 13:57
Nový
│
 
 
└ 
Re: Argh!
Jahudka 4. 7. 2011 15:50
Nový
│
 
 
 
└ 
Re: Argh!
Jakub Vrána 4. 7. 2011 16:03
Nový
│
 
 
 
 
└ 
Re: Argh!
Jahudka 4. 7. 2011 17:13
Nový
│
 
 
 
 
 
└ 
Re: Argh!
Jiří Petruželka (Nox) 4. 7. 2011 17:52
Nový
│
 
 
 
 
 
 
└ 
Re: Argh!
Jahudka 4. 7. 2011 20:52
Nový
│
 
 
 
 
 
 
 
├ 
Re: Argh!
pravdokop - 4. 7. 2011 22:54
Nový
│
 
 
 
 
 
 
 
│
├ 
Re: Argh!
Jakub Vrána 5. 7. 2011 00:16
Nový
│
 
 
 
 
 
 
 
│
│
└ 
Re: Argh!
Zdenek 6. 7. 2011 10:18
Nový
│
 
 
 
 
 
 
 
│
└ 
Re: Argh!
David Grudl 12. 7. 2011 01:52
Nový
│
 
 
 
 
 
 
 
│
 
└ 
Re: Argh!
Oldis 12. 7. 2011 20:46
Nový
│
 
 
 
 
 
 
 
│
 
 
└ 
Re: Argh!
Jakub Vrána 18. 7. 2011 11:00
Nový
│
 
 
 
 
 
 
 
└ 
Re: Argh!
Jiří Petruželka (Nox) 5. 7. 2011 10:41
Nový
│
 
 
 
 
 
 
 
 
└ 
Re: Argh!
Zdenek 6. 7. 2011 10:20
Nový
└ 
Re: Argh!
anonym 4. 7. 2011 12:49
Nový
 
├ 
Re: Argh!
Jakub Vrána 4. 7. 2011 14:07
Nový
 
│
└ 
Re: Argh!
anonym 4. 7. 2011 15:13
Nový
 
│
 
├ 
Re: Argh!
Jakub Vrána 4. 7. 2011 15:54
Nový
 
│
 
│
└ 
Re: Argh!
anonym 4. 7. 2011 19:03
Nový
 
│
 
│
 
└ 
Re: Argh!
Jakub Vrána 4. 7. 2011 20:34
Nový
 
│
 
│
 
 
└ 
Re: Argh!
anonym 4. 7. 2011 21:17
Nový
 
│
 
│
 
 
 
└ 
Re: Argh!
Jakub Vrána 4. 7. 2011 21:33
Nový
 
│
 
│
 
 
 
 
└ 
Re: Argh!
Zdenek 6. 7. 2011 10:26
Nový
 
│
 
└ 
Re: Argh!
Patrik Votoček 4. 7. 2011 16:12
Nový
 
│
 
 
└ 
Re: Argh!
anonym 4. 7. 2011 19:15
Nový
 
│
 
 
 
└ 
Re: Argh!
Jakub Vrána 4. 7. 2011 20:42
Nový
 
└ 
Re: Argh!
paranoiq 7. 7. 2011 12:38
Nový
Bude finally
Michal Wiglasz 4. 7. 2011 10:45
Nový
├ 
Re: Bude finally
Ondřej Nešpor 4. 7. 2011 11:23
Nový
└ 
Re: Bude finally
Filip Procházka 4. 7. 2011 11:57
Nový
 
└ 
Re: Bude finally
Ondřej Nešpor 4. 7. 2011 12:01
Nový
 
 
└ 
Re: Bude finally
Filip Procházka 5. 7. 2011 13:34
Nový
 
 
 
└ 
Re: Bude finally
kukulich 6. 7. 2011 01:02
Nový
Sejfmod
Hufo 4. 7. 2011 15:12
Nový
└ 
Re: Sejfmod
Jakub Vrána 4. 7. 2011 15:45
Nový
 
└ 
Re: Sejfmod
Hugo 4. 7. 2011 16:01
Nový
Register_globals
Martin Kumst 4. 7. 2011 16:08
Nový
└ 
Re: Register_globals
Jakub Vrána 4. 7. 2011 16:15
Nový
 
└ 
Re: Register_globals
Martin Kumst 4. 7. 2011 22:28
Nový
spokojenost
Jiří Petruželka (Nox) 4. 7. 2011 17:59
Nový
file upload progress
adrive 4. 7. 2011 20:52
Nový
└ 
Re: file upload progress
Ladislav Marek 4. 7. 2011 22:35
Nový
Traits a zapouzdření
Miloslav Hůla 4. 7. 2011 23:55
Nový
└ 
Re: Traits a zapouzdření
Jakub Vrána 5. 7. 2011 00:14
Nový
Traits je chaba nahrada vicenasobne dedicnosti
Oldis 5. 7. 2011 17:36
Nový
└ 
Re: Traits je chaba nahrada vicenasobne dedicnosti
Zdenek 6. 7. 2011 10:29
Nový
Traits, k čemu vlastně?
xxxObiWan 7. 7. 2011 03:53
Nový
└ 
Re: Traits, k čemu vlastně?
tiso 7. 7. 2011 09:16
Nový
 
└ 
Re: Traits, k čemu vlastně?
lopata 7. 7. 2011 18:34
Nový
 
 
└ 
Re: Traits, k čemu vlastně?
tiso 8. 7. 2011 09:16
Nový
Magic quotes nejspíš zmizí
Jakub Vrána 12. 7. 2011 11:16
Nový
└ 
Re: Magic quotes nejspíš zmizí
kukulich 22. 7. 2011 13:46
Nový
traits - syntaxe
jos 12. 7. 2011 11:48
Nový
PHP versus Python
expert 15. 7. 2011 22:06
Nový
└ 
Re: PHP versus Python
Jakub Vrána 16. 7. 2011 14:33
Nový
 
└ 
Re: PHP versus Python
jos 18. 7. 2011 10:11
Nový
 
 
└ 
Re: PHP versus Python
Jakub Vrána 18. 7. 2011 10:16
Nový
Další změny
kukulich 17. 7. 2011 15:47
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem