Přejít k navigační liště

Zdroják » PHP » Nejste ve vleku cargo kultů?

Nejste ve vleku cargo kultů?

Články PHP

Dvě životní zkušenosti. Dvě poučení. Pravděpodobně jste něco podobného zažili sami. Nebo vás to teprve čeká.

Text vyšel původně na autorově webu.

Zkušenost první

Před mnoha lety jsem si uvědomil, že když v PHP ve funkci používám proměnnou obsahující předdefinovanou tabulku dat, tak při každém volání funkce musí být pole znovu „vytvořené“, což je překvapivě dost pomalé. Příklad:

function isSpecialName(string $s): bool
{
	$specialNames = ['foo' => 1, 'bar' => 1, 'baz' => 1, ...];
	return isset($specialNames[$name]);
}Code language: PHP (php)

A přišel jsem na jednoduchý trik, který znovuvytváření zabránil. Stačilo proměnnou definovat jako statickou:

function isSpecialName(string $s): bool
{
	static $specialNames = ['foo' => 1, 'bar' => 1, 'baz' => 1, ...];
	return isset($specialNames[$name]);
}Code language: PHP (php)

Zrychlení, pokud pole bylo trošku větší, se pohybovalo v několika řádech (jako třeba klidně 500×).

Takže od té doby jsem u konstantních polí vždy používal static. Je možné, že tento zvyk někdo následoval, a třeba ani netušil, jaký má skutečný důvod. Ale to nevím.

Uplynuly roky

Před pár týdny jsem psal třídu, která nesla v několika properties velké tabulky předdefinovaných dat. Uvědomil jsem si, že to bude zpomalovat vytváření instancí, tedy že operátor new bude pokaždé „vytvářet“ pole, což jak víme je pomalé. Tudíž musím properties změnit na statické, nebo možná ještě lépe použít konstanty.

A tehdy jsem si položil otázku: Hele a nejsi jen ve vleku cargo kultu? Opravdu pořád platí, že bez static je to pomalé?

Těžko říct, PHP prošlo revolučním vývojem a staré pravdy nemusí být platné. Připravil jsem proto testovací vzorek a udělal pár měření. Samozřejmě jsem si potvrdil, že v PHP 5 použití static uvnitř funkce nebo u properties přineslo zrychlení o několik řádů. Ale pozor, v PHP 7.0 už šlo jen o jeden řád. Výborně, projev optimalizací v novém jádře, ale stále je rozdíl podstatný. Nicméně u dalších verzí PHP rozdíl dál klesal a až postupně téměř vymizel.

Dokonce jsem zjistil, že použití static uvnitř funkce v PHP 7.1 a 7.2 běh zpomalovalo. Zhruba 1,5–2×, tedy z pohledu řádů, o kterých se tu celou dobu bavíme, zcela zanedbatelně, ale byl to zajímavý paradox. Od PHP 7.3 rozdíl zmizel zcela.

Zvyklosti jsou dobrá věc, ale je nutné jejich smysl stále validovat.

Zkušenost druhá

Zbytečný static v těle funkcí už používat nebudu. Nicméně u oné třídy, která držela velké tabulky předdefinovaných dat v properties, jsem si řekl, že je programátorsky správné konstanty použít. Za chvíli jsem měl refaktoring hotový, ale už jak vznikal, jsem naříkal nad tím, jak se kód stává ošklivým. Místo $this->ruleToNonTerminal nebo $this->actionLength se v kódu objevovalo řvoucí $this::RULE_TO_NON_TERMINAL a $this::ACTION_LENGTH a vypadalo to fakt hnusně. Zatuchlý závan ze sedmdesátých let.

Až jsem zaváhal, jestli vůbec chci koukat na tak hnusný kód, a jestli raději nezůstanu u proměnných, případně statických proměnných.

A tehdy mi to došlo: Hele nejsi jen ve vleku cargo kultu?

No jasně že jsem. Proč by měla konstanta řvát? Proč by měla na sebe upozorňovat v kódu, být vyčnívajícím elementem v toku programu? Fakt, že struktura slouží jen ke čtení, není důvod PRO ZASEKNUTÝ CAPSLOCK, AGRESIVNÍ TÓN A HORŠÍ ČITELNOST.

TRADICE VELKÝCH PÍSMEN POCHAZÍ Z JAZYKA C, KDE SE TAKTO OZNAČOVALY MAKROKONSTANTY PREPROCESORU. BYLO UŽITEČNÉ NEPŘEHLÉDNUTELNĚ ODLIŠIT KÓD PRO PARSER OD KÓDU PRO PREPROCESOR. V PHP SE ŽÁDNÉ PREPROCESORY NIKDY NEPOUŽÍVALY, TAKŽE NENÍ ANI DŮVOD psát konstanty velkými písmeny.

Ještě ten večer jsem je všude zrušil. A stále nemohl pochopil, proč mě to nenapadlo už před dvaceti lety. Čím větší blbost, tím tužší má kořínek.

Komentáře

Odebírat
Upozornit na
guest
5 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
Zobrazit všechny komentáře
Makovec

Věcně k problému jenom pochvalnou poznámku: refaktoring s ohledem na to zda náhodou staré pravdy ještě platí je nepochybně dobrá věc.

Nicméně bych se pozastavil u použití termínu cargo cult v tomto kontextu: tím by to bylo kdyby ta původní řešení nikdy nefungovala a snažila se vnější nápodobou nějakého patternu odvedle dosáhnout neexistujícího efektu.

Třeba kdyby ta velká písmena v názvech konstant byla psaná proto, že by autor věřil že nazváním proměnné velkými písmeny z ní udělá konstantu (tj. že pak nepůjde její hodnota měnit).

To co popisuje autor bych spíš nazval zajetí starých paradigmat nebo překonaných patternů nebo zastaralých, již nefunkčních practices

Martin Hassman

Pojem “cargo kult” se dnes používá ve velmi širokém kontextu, v “Naše řeč” hovoří i o obecnějším použití v souvislosti s pošetilým jednáním http://nase-rec.ujc.cas.cz/archiv.php?art=8197 V tom kontextu je použití zde v textu v pořádku. Ale to rozhodně nebrání hledaní názvů přesnějších.

Jarda

Pouzivani terminu cargo cult jen pro cargo cult je cargo cult :-)

Bohumil

„Consistency is a refugee for people who must read my code later and shouldn’t need to learn all of the reasons I thought I was smarter than the community consesus.“

Mastodont

By convention, constant identifiers are always uppercase.

https://www.php.net/manual/en/language.constants.php

Baro vs. Claude Code: Když paralelní agenti prohrají s jedním sezením (a co s tím udělat)

AI
Komentáře: 0
Více agentů musí být rychlejší než jeden, ne? Miodrag Todorović z JigJoy postavil baro - CLI, které paralelně spouští pět Claude sezení místo jednoho - a postavil ho proti novému příkazu /goal v Claude Code. Čekal jasnou výhru paralelismu. Místo toho prohrál v čase, v tokenech i v kvalitě výsledného kódu. Z analýzy tří konkrétních selhání ale vyšel jeden nečekaný závěr: problém nebyl v koordinaci mezi agenty, ale v rozhodnutích, která padla ještě před tím, než se kdokoli z nich probudil. Oprava trvala 200 řádků kódu - a v odvetě baro porazilo /goal o 4 minuty.

WebGPU už mají všechny hlavní enginy. Hotový standard z něj W3C dělat nechce

Na jaře 2026 už WebGPU není jen záležitost Chromia nebo preview buildů. Chrome, Edge, Safari i Firefox ho dodávají v produkčních verzích, ale ne na stejných platfórmach a ne se stejnými limity. WebGPU navíc podle aktuální charty pracovní skupiny nemíří z Candidate Recommendation do W3C Recommendation. Pro vývojáře je proto důležitější konkrétní podpora, fallbacky a limity paměti než formální status standardu.