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í ![]()
Š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 dá < ⇒ pá
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?
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 .
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.
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.

