Runkit
Setkali jste se někdy s potřebou předefinovat již existující funkci nebo změnit konstantu? PHP něco takového neumožňuje a jsem toho názoru, že to je dobře – většinou to svědčí o špatném návrhu aplikace. S využitím rozšíření Runkit to ale možné je, používat bych to ale doporučoval jen ve speciálních případech (například skript, který generuje PHP kód a následně s ním manipuluje), rozhodně ne pro řešení běžných úloh.
<?php // příklad převzatý z PHP dokumentace function testme() { echo "Original Testme Implementation\n"; } testme(); runkit_function_redefine('testme', '', 'echo "New Testme Implementation\n";'); testme(); ?>
Předefinování se nedá použít při zapnuté direktivě runkit.internal_override dá použít i pro rozšíření možností vestavěné PHP funkce, kterou používá již hotový kód. Stejně mi ale přijde lepší napsat si funkci vlastní a v kódu to změnit. Pak je ale také potřeba zajistit, aby se tato funkce používala i v budoucím kódu.
Od PHP 5.1 je podporovaný také sandboxing – v rámci PHP kódu lze spustit nový interpret, takže např. díky funkci runkit_lint_file je možné zkontrolovat syntaxi souboru s PHP kódem. V PHP 5.0 k tomuto účelu sloužila funkce php_check_syntax, ale pravděpodobně proto, že zamořovala tabulku funkcí (funkce definované v kontrolovaném souboru byly viditelné navenek a naopak), byla v PHP 5.0.5 opět vyňata. Standardní možností kontroly syntaxe souboru tak zůstává php -l
.
Diskuse
spaze:
U runkitu je zajimava nasl. vec:
- It also provides for custom superglobal variables
A tusim, ze se pomoci runkitu da udelat i vicenasobna dedicnost, to je ale bez zaruky (jde to pomoci aggregate* funkci).

Gimli2:
S pomoci aggregate* bys toho mel byt schopen i bez runkitu v php 5.x.x, sice by to byla asi nesnadna "rucni" prace... musel bys mit nejaky vlastni postup, jak parsovat vysledky aggregate a pak jak davat objekty dohromady a u nich spravne zachovavani promennych a metod...Zatim jsem ale v PHP nenarazil na potrebu mit vicenasobnou dedicnost.
Michal Aichinger:
no jenze aggregate* jsou jen pro PHP4 :-)Emo:
Osobne runkit pouzivam pro daemona v PHP, kde je implementovana moznost pripojit se pres socket a pres jeho "admin API" mu predat pozadavek na pridani/zmenu/zruseni trid a hlavne jejich metod. Ma to vyhodu, ze neni napr. treba provadet restart daemona pro rozsireni jeho funkcnosti.Diskuse je zrušena z důvodu spamu.

