runkit_import

(PECL runkit >= 0.7.0)

runkit_import ファイルから関数やクラスの定義を読み込み、必要に応じて書き換える

説明

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

include と似ていますが、関数やクラスの外部に あるコードは無視されます。 また、flags の設定により、 現在実行中の環境内の既存の関数やクラスを自動的に上書きします。

パラメータ

filename

関数やクラスの定義を読み込むファイル名。

flags

RUNKIT_IMPORT_* 系の定数の論理和。

返り値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

例1 runkit_import() の例

<?php
// クラス全体をインポートします
runkit_import('myfile.inc'RUNKIT_IMPORT_CLASSES);

/* クラスをインポートしますが、その static プロパティはインポートしません
   (RUNKIT_IMPORT_CLASS_STATIC_PROPS は 1.0.1 以降で使用可能です) */
runkit_import('myfile.inc'RUNKIT_IMPORT_CLASSES & ~RUNKIT_IMPORT_CLASS_STATIC_PROPS);

/* クラスの static プロパティだけをインポートします
   (RUNKIT_IMPORT_CLASS_STATIC_PROPS は 1.0.1 以降で使用可能です) */
runkit_import('myfile.inc'RUNKIT_IMPORT_CLASS_STATIC_PROPS);
?>

add a note add a note

User Contributed Notes 6 notes

up
1
dabbers
16 years ago
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.
up
1
bbisgod [at] gmail [dot] com
19 years ago
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.
up
0
Maxdamantus
17 years ago
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");
?>
up
0
info at lucasvd dot nl
17 years ago
Note that reloading classes does not work, when you're using this extension on the PHP Command Line Interface.
up
0
php at ransico dot com
18 years ago
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.
up
0
bbisgod [at] gmail [dot] com
19 years ago
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;
    }
  }
}
?>
To Top