如何从前一个范围获取所有声明的变量?

时间:2012-02-16 12:47:42

标签: php variables

// SCOPE 1
printsmth();    

function printsmth(){
  // SCOPE 2 (printsmth)

  // here (inside SCOPE 2) get variables visible in SCOPE 1
  // var_dump($vars);
}

我可以这样做吗?

基本上我想从调用函数的地方获取所有声明的变量,但是在函数内部(并忽略在我的函数中声明的变量)


类似于在我的函数中获取get_defined_vars();的结果,但是对于之前的范围:)


更清楚 - 我只想要自己克隆`get_defined_vars`函数。当我调用我的函数时,它应该在当前作用域中显示已声明变量的列表。

5 个答案:

答案 0 :(得分:2)

您可以在范围1中简单地将变量声明为全局变量,并为变量赋值。进一步在函数体(范围2)中声明与global相同的变量来访问它。以上示例变为

// SCOPE 1
global $var1, $var2;
$var1 = 1;
$var2 = 2;

printsmth();    

function printsmth(){
   global $var1, $var2;
   echo 'Var1:' . $var1 . 'Var2:' . $var2;//now accessible in scope 2
}

另一个选择是您可以通过引用传递变量到函数。例如,

// SCOPE 1
$var1 = 1;
$var2 = 2;

printsmth($var1, $var2);

// Note the "&" appended to the parameters. This passes the variables to the 
// function by reference. Any modifications made to the variables will update
// the actual variables in the scope 1

function printsmth(&$var1, &$var2){
   global $var1, $var2;
   echo 'Var1:' . $var1 . 'Var2:' . $var2;//now accessible in scope 2
}

答案 1 :(得分:1)

它如此简单

$valriable_Outside_scope;
// SCOPE 1
printsmth();    

function printsmth(){
  global $valriable_Outside_scope;
  // SCOPE 2 (printsmth)

  // here (inside SCOPE 2) get variables visible in SCOPE 1
}

global varibale_name; //将允许你访问外部范围项

答案 2 :(得分:1)

我知道你在问什么。这是你(或我)想要的方式所不可能的。

您必须以与上述方式类似的方式传递它们。我就是这样做的:

function print_smith($globals) {
    extract($globals);
    echo $variable;
}

$variable = 'Smith';
$vars = get_defined_vars();
printsmith($vars); // Smith

这种方式稍微冷一点(没有传递参数):

function print_smith() {
    global $vars;
    if(NULL !== $vars) {
        extract($vars);
    }
    echo $variable;
}

$variable = 'Smith';
$vars = get_defined_vars();
printsmith(); // Smith

答案 3 :(得分:0)

使用global关键字:

$variable = true;

function printsmth(){
  global $variable;

  if ( $variable ) {
    echo 'it works';
  }
}

printsmth();

答案 4 :(得分:0)

这样:

       $var = "hello";
       printsmth();

       function printsmth(){
         global $var;
         echo $var;
       }