3

たとえば、次の関数があります。

function foo($whaaaat){

  $var1 = 'a';  
  $a = 1;
  $b = 2;

  ...


  // here unset all variables defined above (including arguments) 
  require 'somefile.php';
}

では、必要なポイントの前にこれらの変数をすべて設定解除できますか?

明らかに、各変数で unset を手動で呼び出すことなく、それは私が自分自身を理解したからです:)

これを行う機能はありますか?

4

8 に答える 8

8

匿名関数requireでラップできます:

function foo($a){
  $b = 2;

  call_user_func(function() {
   require 'somefile.php';
  });
}
于 2011-10-20T18:56:46.647 に答える
7

これらの関数内変数がグローバルに宣言されていないと仮定すると、次のようなものを試すことができます

array_diff(get_defined_vars(), $GLOBALS)

ローカル変数のリストを取得し、結果をループして設定を解除します。

于 2011-10-20T18:58:44.060 に答える
4

次のようにできます。

function require_noscope($filename)
{
    // Required file cannot see variables from other function
    require $filename;
}

function foo($whaaaat){

  $var1 = 'a';  
  $a = 1;
  $b = 2;
  require_noscope('somefile.php');
}
于 2011-10-20T18:55:53.303 に答える
2

これはうまくいくかもしれません(テストされていません):

$allVars = get_defined_vars(); // Returns array of all defined variables
foreach ($allVars as $allVars) { unset($allVars); }

編集:私が言ったように、これをテストしたことも使用したこともありませんが、アレックスを正しい方向に導くことができます.

于 2011-10-20T18:57:39.423 に答える
2

解決策は次のとおりです。

echo('Before: ' . $test1 . '<br>');

$vars = array_keys(get_defined_vars());
foreach($vars as $var) {
    if($var == 'GLOBALS' || $var == '_POST' || $var == '_GET' || $var == '_COOKIE' || $var == '_FILES' || $var == '_REQUEST' || $var == '_SERVER' || $var == '_ENV')
        continue;
    unset($$var);
}
echo('After: ' . $test1 . '<br>');

私のテストはこれを出力します:

前:ここ?

後:

于 2011-10-20T19:02:39.693 に答える
1

砥石さんに賛成です。get_defined_vars()「マルチアンセット」トリックに最適です。以下のこのメソッドは、すべての変数の設定を解除します。foreach ループ内の名前のない配列内にあるものを除くすべて。

foreach(get_defined_vars() as $k=>$y){ 
 if( !in_array( $k, 
 array(
  'myRequredVariableName1',
  'myRequredVariableName2',
  '_ENV',
  '_SESSION',
   '_COOKIE',
  'HTTP_SESSION_VARS',
  'HTTP_COOKIE_VARS'
  )))
  { $$k=null; unset($$k);} 
    unset($y, $k);
} 

// Check for leftovers
header('Content-type:text/plain; charset=utf-8'); 
var_export(get_defined_vars()); 
exit;

値は、実際には '$' のない変数名です。変数 variableunset($$k);は、REAL および定義済みのものと一致し、存在する場合は破棄します。したがって、このようにして、システムに残されたものを完全に制御できます。

一部の共有ホスティング設定は _SERVER スーパーグローバルのみに依存しているため、_ENV、HTTP_SESSION_VARS、HTTP_COOKIE_VARS はまったく必要ないことに注意してください。ほとんどの場合、常に _COOKIE と _SESSION を保持したいでしょうが、_GET と _POST や _FILES は保持したくないでしょう。決定は異なります。このトリックを実稼働環境に適用する前に、配列内に何を置くべきかを自分でテストして確認してください。

于 2013-05-31T13:22:58.217 に答える
1

何も組み込まれていませんが、get_defined_vars()関数を使用してすべての定義済み変数の配列を取得し、foreachループを使用してそれらを設定解除できます。このように 4 行ですべてを完了することができ、柔軟性があります。

$list_of_vars =  array_diff(get_defined_vars(), $GLOBALS); // Was just get_defined_vars() before Marc B corrected me in his post.
foreach($list_of_vars as $var){
    unset($var);
}

編集: Marc B が指摘したように、これにより $GLOBAL 変数も設定解除されます。変数のリストを適切に取得する方法を示すために、例を編集しました。

于 2011-10-20T18:57:08.323 に答える