Jak jsem si tak projížděl PHP třídy, které používám pro různé pomocné operace, narazil jsem na jednu, která dělá jednoduchý objektový statický wrapper nad manipulací s include_path
. Nějak se mi zalíbilo mít pro include_path jednoduché přidání a odebrání cesty do/z include_path
.
IncPath::add("/usr/local/new/path"); IncPath::remove("/usr/local/old/path");
Přímo v php jsou funkce set_include_path
a get_include_path
, které se mi moc nelíbí právě z toho důvodu, že pracují s include_path jako s celkem. Ano, userspace wrapper v PHP je v celku jednoduchá záležitost. Mě se ale moc nelíbí používat funkce a třídy, které patří spíš do PHP jako takového, nějakým způsobem se snaží řešit přímo něco z PHP jako prostředí/jazyka. Kromě include_path to často jsou funkce pro pole, různé simulátory properties přes __get/__set
.
Nu, tak jsem si řekl, že to zkusím jako PHP extension, tedy přímo v C. Taková záležitost by nemusela být moc složitá. Trochu hodně jsem se seknul, byla a je to pro mě to velmi náročná věc, zejména když o tom, jak se píší PHP extension jsem neměl ani páru a o C jste se naposledy otřel tak před 8 lety a to jen na chvíli a ne nějak důkladně.
Nebudu to prozatím moc protahovat, nakonec jsem něco upatlal. Můžete se na to podívat u mě v repositáři. Zatím jsem to nikde přímo nenasadil (neinstaloval). Počítám, že to bude chtít ještě dost času na úpravy. Nicméně nějaké základní testy už projdou, takže můžete klidně odzkoušet případnou instalaci. Zkompilovat a nainstalovat (netestováno) by se to tedy mělo klasickou phpize
metodou pro php extensions. Budete samozřejmě potřebovat zdrojáky PHP, dělal jsem to na 5.3 (web už jede na 5.3.1)
# cd /test/phpincpath # phpize # ./configure --with-incpath # make # make install
API by mělo být velmi jednoduché, v php by skeleton třídy vypadal asi takto:
class IncPath { /** * Add path into include_path * @param string $path * @return void */ public static add($path); /** * Remove path from include_path * @param string $path * @return void */ public static remove($path); /** * gets all path in include_path as array * @return array */ public static getPathArray(); }
Trošku se mi nezdá to static
, statické třídy nejsou úplně to pravé ořechové zejména kvůli testování. Je to v podstatě globální bordel jen v namespace. Ale zase pro manipulaci s include_path dělat dynamické API, nevím.
Během toho, co jsem extension dělal, jsem nasbíral trošku poznatků o tom, jak se php extension píší. Takže příští články budou asi o tomhle tématu. Samozřejmě uvítám poznatky někoho dalšího, kdo má s php extension API zkušenosti, protože i ve světě se o tomhle dozvíte poměrně málo informací.
Komentáře (1)
Ahoj,
tak toto si zada 5 hvezdickove oceneni za odvahu ;), jaky dalsi serial o psani PHP ext (aspon ten zaklad, jak co funguje a jak udelat nejakou jenoduchou ext napr. hello world je vitany)
Uz se tesim na dalsi dil, diky
Komentáře jsou uzavřeny.