Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Nejkratší parse error v PHP

Jaký je nejkratší kód v PHP, který způsobí parse error? Má právě 5 znaků a vyžaduje povolené short_open_tag:

<?php

Po spuštění vyhodí:

Parse error: syntax error, unexpected $end of file in test.php on line 1

Syntaktickou chybu lze opravit přidáním mezery nebo odřádkování :-)

clock 4. 12. 2011 pencil PHP comments Komentáře: 8


Špeky a párky v nahrazování řetězců

Jak se nenechat vypéct při nahrazování výskytů jednoho řetězce jiným.

Základní funkcí pro nahrazování řetězců v PHP je str_replace:

$s = "Lorem ipsum";
echo str_replace('ore', 'ide', $s); // vrací "Lidem ipsum"

Díky chytře vymyšlenému kódování UTF-8 ji lze spolehlivě používat i pro takto kódované řetězce. Navíc jako první dva argumenty lze uvést pole a funkce potom provede vícenásobné nahrazení. A tady narážíme na první špíček, který je třeba mít na zřeteli. Každé nahrazení prochází řetězec znovu, pokud bychom tedy chtěli ve větě pánské dárky prohodit < ⇒ a získat tak dánské párky (švédská delikatesa!), žádné pořadí argumentů k cíli nepovede:

// vrací "dánské dárky"
echo str_replace(array('dá', 'pá'), array('pá', 'dá'), "pánské dárky");

// vrací "pánské párky"
echo str_replace(array('pá', 'dá'), array('dá', 'pá'), "pánské dárky");

Hledanou funkcí, která řetězec projde jen jednou a zamezí vzniku kolizí, je strtr:

// vrací "dánské párky", hurá
echo strtr("pánské dárky", array('pá' => 'dá', 'dá' => 'pá'));

Pokud bychom hledali výskyty podle složitějších pravidel, využijeme regulární výrazy a funkci preg_replace. Ta také umožňuje vícenásobné nahrazování a chová se stejně jako str_replace. Teď však mířím jinam. Potřebuji v řetězci nahradit všechny čísla slovem hafo, což je snadné:

$s = "Radek tvrdí, že má IQ 151. Pěkný sběratelský kousek!";
echo preg_replace('#\d+#', 'hafo', $s);

Zobecněme kód, nechť umí čísla nahradit čímkoliv, co mu předáme v proměnné $replacement. Řada programátorů použije:

return preg_replace('#\d+#', $replacement, $s); // spatne!

Což bohužel není dobře. Je třeba si uvědomit, že i v nahrazovaném řetězci mají určité znaky speciální význam (konkrétně lomítko a dolar), proto ho musíme escapovat. Správné obecné řešení je:

return preg_replace('#\d+#', addcslashes($replacement, '$\\'), $s); // ok

Napadají vás ještě nějaké nahrazovací špeky?

clock 30. 11. 2011 pencil PHP comments Komentáře: 4


Git: snadný cherry-pick z Githubu

Pokud vám někdo na Githubu pošle commit, je vhodné ho před začleněním do hlavní větve ověřit nebo třeba upravit. Jak si snadno commit z Githubu vyzobnout do svého repozitáře? Používám k tomu skript remotepick.phpc, který spustím v repozitáři a jako parametr uvedu URL commitu. Což je adresa, na kterou vede například odkaz 363413a na této stránce. Takže spustím:

remotepick.phpc https://github.com/hrach/nette/commit/363413a042adff12a3e26b28fb4fabebdeb208f8

A skript vypadá takto:

<?php
$url = @$_SERVER['argv'][1];

if (!preg_match('#github\.com/([^/]+)/([^/]+)/commit/(\w+)$#', $url, $m)) {
        exit("Invalid URL");
}

list(, $name, $repo, $hash) = $m;
passthru("git remote add temp http://github.com/$name/$repo.git");
passthru("git fetch temp");
passthru("git cherry-pick $hash");
passthru("git remote rm temp");

Poté se commit objeví v aktuální větvi .

clock 22. 11. 2011 pencil PHP comments Komentář: 1


Git: jak na hromadný rebase

Pokud máte v Git repozitáři víc vývojových větví, je rozhodně dobré je průběžně aktualizovat oproti masteru. V řeči Gitu jde o rebase. Aktualizované větve se pak mnohem snáze aplikují (merge) do hlavní vývojové větve. A pokud máte větví opravdu hodně, aktualizovat každou zvlášť je zdlouhavé. Pomoci může skript rebaseall.phpc, který stačí zavolat někde uvnitř repozitáře:

<?php

// zjisti seznam větví
exec('git branch', $branches);

// postupně každou rybejzuj proti masteru
foreach ($branches as $branch) {
        $branch = trim($branch, "* \r\n");
        passthru("git rebase master $branch", $errorCode);
        if ($errorCode) {
                exit;
        }
}

// a nakonec se vrať na master
passthru('git checkout master');

Je možné, že se to dá zapsat i jedním příkazem z bashe, ale já rád skriptuju v PHP a bash nemám.

clock 22. 11. 2011 pencil PHP comments Komentáře: 2


Zen Dependency Injection

Dependency Injection je technika, která řeší určité problémy, ale zároveň přináší těžkosti nové. Ty se pak snaží eliminovat DI kontejner, který od vás vyžaduje změnit pohled na objektový návrh.

Pokud vás netrápí problémy, které DI řeší, tak jeho nasazení budete vnímat jen jako zbytečnou obtíž. Třeba právě v nutnosti osvojení nového pohledu na objektový návrh.

Nicméně zdá se, že pokud vás netrápí problémy, které DI řeší, máte vážný problém. Což zjistíte, až to zjistíte.

clock 10. 10. 2011 pencil PHP comments Komentář: 1


phpFashion © 2004, 2012 David Grudlo webu

Pokud není uvedeno jinak, podléhá obsah těchto stránek licenci Creative Commons BY-NC-ND Creative Commons License BY-NC-ND

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.