Web aym.pekori.to

Runkit_Sandbox_Parent

(no version information, might be only in CVS)

Runkit_Sandbox_Parent --  Runkit 反サンドボックス(Anti-Sandbox)クラス

説明

void Runkit_Sandbox_Parent::__construct ( void )

Runkit_Sandbox クラスが作成した サンドボックス環境から Runkit_Sandbox_Parent クラスのインスタンスを作成し、サンドボックスからその親インスタンスに アクセスするための(管理された)手段を提供します。

注意: サンドボックスのサポート (runkit_lint(), runkit_lint_file(), および Runkit_Sandbox クラスで使用)は、PHP 5.1 以降または特別なパッチを適用した PHP 5.0 でのみ利用可能であり、スレッドセーフを有効にしておく必要があります。 詳細については、runkit パッケージに含まれる README ファイルを参照してください。

Runkit_Sandbox_Parent の機能を有効にするには、 親のコンテキストから各サンドボックス単位で parent_access フラグを有効にする必要があります。

例 1. サンドボックスから変数を使用する

<?php
$sandbox
= new Runkit_Sandbox();
$sandbox['parent_access'] = true;
?>

親の変数にアクセスする

サンドボックス内の変数へのアクセスと同様、親の変数の読み込みや 親の変数への書き込みが可能です。これは Runkit_Sandbox_Parent クラスのプロパティとして 扱われます。親の変数の読み込みは、parent_read 設定を有効にすることで可能となります(それに加えて、基本となる parent_access の設定も必要です)。 一方、書き込みについては parent_write の設定により 可能となります。

サンドボックス内の変数へのアクセスとは異なり、変数のスコープが グローバルに限定されることはありません。parent_scope を適切な整数値に設定することで、アクティブなコールスタック内で 他のスコープが使用可能です。0(デフォルト)は、グローバルスコープで 変数に直接アクセスします。1 は、サンドボックスのコードが実行された ブロック内のスコープを設定します。それより大きい値を指定した場合、 サンドボックスのコードを実行した関数の呼び出し元を順にたどり、 そのスコープの変数にアクセスしようと試みます。

例 2. 親の変数にアクセスする

<?php
$php
= new Runkit_Sandbox();
$php['parent_access'] = true;
$php['parent_read'] = true;

$test = "Global";

$php->eval('$PARENT = new Runkit_Sandbox_Parent;');

$php['parent_scope'] = 0;
one();

$php['parent_scope'] = 1;
one();

$php['parent_scope'] = 2;
one();

$php['parent_scope'] = 3;
one();

$php['parent_scope'] = 4;
one();

$php['parent_scope'] = 5;
one();

function
one() {
    
$test = "one()";
    
two();
}

function
two() {
    
$test = "two()";
    
three();
}

function
three() {
    
$test = "three()";
    
$GLOBALS['php']->eval('var_dump($PARENT->test);');
}
?>

上の例の出力は以下となります。

string(6) "Global"
string(7) "three()"
string(5) "two()"
string(5) "one()"
string(6) "Global"
string(6) "Global"

親の関数をコールする

適切な設定を有効にすることで、サンドボックスはその親の関数に アクセスすることが可能となります。 parent_call を有効にすると、サンドボックスから 親スコープの全ての関数をコールすることが可能となります。 言語構造については、以下のように個々の設定項目で管理されます。 print() および echo()parent_echo を有効にすると使用可能です。 die() および exit()parent_die を有効にすると使用可能です。 eval()parent_eval を 有効にすると使用可能です。また include()include_once()require() および require_once()parent_include を有効にすると使用可能です。