Runkit

Školení, která pořádám

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.

Jakub Vrána, Seznámení s oblastí, 11.11.2005, diskuse: 4 (nové: 0)

Diskuse

ikona 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.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.