runkit_import

(PECL runkit >= 0.7.0)

runkit_import Обрабатывает PHP файл, импортируя функции и классы, перезаписывая при необходимости.

Описание

bool runkit_import ( string $filename [, int $flags = RUNKIT_IMPORT_CLASS_METHODS ] )

Функция похожа на include, за исключением того, что весь код вне функций и объявлений классов игнорируется. В зависимости от значения параметра flags существующие функции и классы будут автоматически заменены новыми реализациями.

Список параметров

filename

Имя файла, из которого будут импортированы классы и функции

flags

Значение побитового ИЛИ семейства констант RUNKIT_IMPORT_*/

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Коментарии

Heres a nice function to reload the whole program, note, requires PHP5.1:

<?php
function reload() {
 
$files get_included_files();
  foreach(
$files as $file) {
    if (
runkit_lint_file($file)) {
     
runkit_import($file);
    } else {
      return 
false;
    }
  }
}
?>
2005-11-29 12:27:31
http://php5.kiev.ua/manual/ru/function.runkit-import.html
I was experiencing problems using this function on a script. I discovered through trial and error that you CANNOT reload a function (or method of a class) if it has been called (e.g, its present in the debug_backtrace). Also you cannot redeclare a function that is used by set_error_handler.

The reasons are logical, but it took me a good 2 days of debugging to find it, hope this saves someone a headache.
2005-11-29 13:19:59
http://php5.kiev.ua/manual/ru/function.runkit-import.html
When using this function to override an existing class, you need to be careful in cases where the new definition 'extends' another class - it won't work.

For example,

<?php
// File 1

class BaseCls { }

class 
TestCls extends BaseCls {
  function 
hi () { echo "Hi"; }
}

runkit_import('test2.php');

?>

<?php
// File 2
class TestCls extends BaseCls {
  function 
hi () { echo "Hi again!"; }
}
?>

will NOT work. In file two, you need to omit the 'extends BaseCls'. Note however, that anything from BaseCls will still be in TestCls since it was defined originally in file 1.

From what I can tell, runkit_import defines and overwrites elements - however it does not delete.
2006-11-02 07:17:47
http://php5.kiev.ua/manual/ru/function.runkit-import.html
Note that reloading classes does not work, when you're using this extension on the PHP Command Line Interface.
2007-02-13 09:13:08
http://php5.kiev.ua/manual/ru/function.runkit-import.html
Автор:
In reply to the comment made by info at lucasvd dot nl:

Runkit WILL reload classes, but the runkit_import must be called from inside an other class or object to do so.

<?php
class reload{
    function 
__construct($file){
       
runkit_import($file);
    }
}

new 
reload("myclassfile.php");
?>
2007-11-26 00:35:51
http://php5.kiev.ua/manual/ru/function.runkit-import.html
Автор:
It appears that this function still doesn't remove the previous class. I'm not sure what it does to it, but looking at memory usage, it only goes up instead of staying the same or going down (This was when I reloaded a class that was exactly the same).

So that might be something to fix, unless I'm doing something wrong.
2008-08-15 19:58:33
http://php5.kiev.ua/manual/ru/function.runkit-import.html

    Поддержать сайт на родительском проекте КГБ