Objektový String – píšete $s->substr(10)->trim()…?
- filsedla
- Člen | 101
Procházel jsem kód a koukal, co se mi nelíbí, a co bych chtěl příště zkusit psát jinak:
$finalName = Strings::lower(Strings::webalize(Strings::substring($fileName, 0, 100)) . '.' . $extension);
Je to nepřehledné.
Prostudoval jsem si toto starší vlákno (žádné nadšení) a Je třeba, aby Nette\String byla třída? Primárně se toho netýká, ale je 6 let staré a obsahuje zajímavé predikce toho, co se bude dít za 5 let :-).
Chtěl bych psát
$finalName = ($fileName->substring(0,100) . '.' . $extension)->lower();
nebo dokonce "neco"->trim()
(vím, že to nejde)
Co mám dělat? Jak to řešíte vy? Co se změnilo od minula a v čem vidíte budoucnost?
- Zůstat u statických metod Strings::trim() a oželet fluent interface
- Vlastní servery už jsou dostupnější, takže rozšířit PHP např. https://github.com/…alar_objects
- Odejít z Nette a PHP
- Napsat si vlastní třídu String
Str
s tím, že nepůjde všechno, bude to mít „ošklivý začátek“(new String("neco"))->trim()
(to bude chtít PHP7, že?) nebostr("neco")->trim()
, ale fluent interface dostanu - Použít nějakou už existující třídu String (znáte něco?)
- CZechBoY
- Člen | 3608
Zrovna vcera jsem nad tim taky premyslel :D
Tedka jsem v rychlosti nasel https://github.com/…er/README.md
coz vypada celkem dobre.
edit: Jo, tys to taky nasel. Na prvni pohled se mi to zda jak bych si to predstavoval.
Editoval CZechBoY (14. 1. 2017 11:28)
- filsedla
- Člen | 101
@CZechBoY Vyzkoušel jsem scalar_objects (na Windows PHP7). Funguje
to. Má to akorát vadu, že StringHandler
má jiné signatury
metod než jak se to ve výsledku tváří. Aby fungovalo napovídání
v PhpStormu, musel bych kromě StringHandleru
ještě napsat
StringStub
se správnými metodami. A pak, je to pořád PHP
rozšíření, asi si ho netroufnu použít.
@GEpic Append, tak je to lepší. Já většinou používám ty verze
ze Strings
.
- mkoubik
- Člen | 728
U těchto obalovacích tříd (String
, Array
,
Collection
, apod.) je problém s rozšiřitelností. Musíš na
nich definovat všechny operace a další se pak nedají přidávat (resp. jen
dědičností nebo extension-metodami, což je obojí horší varianta než
nemít nic).
Já bych radil dál používat statické metody (tohle je přesně použití na které jsou dělané) a počkat si na pipe operátor v php, pak se to bude zapisovat takhle:
$finalName = Strings::substring($fileName, 0, 100)
|> Strings::webalize($$)
|> Strings::lower($$ . '.' . $extension);
Editoval mkoubik (16. 1. 2017 12:06)
- filsedla
- Člen | 101
@mkoubik Pipe operátor se mi nelíbí. Jeden z důvodů, proč mít
objektový přístup je, že si nebudu muset pamatovat, co je haystack a co
needle (v metodách s hodně parametry). Haystack bude většinou to, na čem
metodu volám a jako parametr ho tedy neuvedu. S pipe operátorm bych všechny
parametry musel uvádět a jeden z nich dokonce pomocí nicneříkajícího
$$
.
Proč přesně bys nemohl String
rozšířit dědičností
o vlastní metodu?
- mkoubik
- Člen | 728
@filsedla To $$
se mi taky moc nelíbí, ale
předpokládám že to zavedli právě kvůli bordelu v pořadí parametrů
built-it funkcí. V jiných jazycích bývá zvykem předávat „haystack“
jako první parametr, takže ho z toho pipe operátoru můžeš vynechat. Nebo
tam existuje něco jako thread-first a thread-last makra.
Dědičnost se mi nelíbí protože míchá do jednoho typu to že chceš string a co s ním pak chceš dělat. Musíš to pak všude řešit při typehintovaní a předávání parametrů, místo abys tam dal string a hotovo.
Editoval mkoubik (16. 1. 2017 16:12)