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

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: Reakce na: spaze

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