PHP范围子匿名函数在父函数中改变变量

时间:2015-07-03 07:49:06

标签: php scope

我有以下代码。

function up() {
    $runafterupdate = [];
    Schema::connection('exitproducts')->create('exitcontrol_carmanager_manager',  function($table)
                {
                    $table->engine = 'InnoDB';
                    $table->increments('id');
                    $table->string('code');
                    $runafterupdate['code'] = true;
                    $table->timestamps();
                });
            }
    if(isset($runafterupdate['code'])) {
        echo "it worked!";
    }
}

我已经习惯了JavaScript,您可以在其中更改父作用域的值,但显然php遵循不同的规则。 我试过阅读http://php.net/manual/en/language.variables.scope.php,但我真的不想使用全局变量。

有没有办法用php改变父作用域中的变量,或者在这种情况下我唯一的手段是全局变量?

4 个答案:

答案 0 :(得分:1)

如果这个函数在一个类中,如果你将变量声明为public,private或protected,我就不会发现问题(如果需要,我会使用private并为此变量创建set / get函数)。之后,您可以在匿名函数中执行$this->runafterupdate = true。如果你的函数不在一个类中,我会使用全局变量,但我真的不建议。

你试过use关键字吗?

答案 1 :(得分:0)

你有一个匿名函数,在你的类中声明select * from mytable where p_optional_id_node is null union all select * from mytable where p_optional_id_node = n.id; 作为私有数组,在匿名函数中使用$runafterupdate然后检查它。我猜你正在使用Laravel

$this->runafterupdate

这应该有用,如果我没有弄错,我有类似的问题

答案 2 :(得分:0)

经过多次挖掘......为什么我在发布问题后总能找到答案......

在函数上使用use子句,您可以使用在“子”范围内声明的变量。 这在php docs的范围文档中没有突出显示我的意思。

摘自Reference: What is variable scope, which variables are accessible from where and what are "undefined variable" errors?

将变量范围扩展为匿名函数

$foo = 'bar';

$baz = function () use ($foo) {
    echo $foo;
};

$baz();

经过一番摆弄后,我发现我无法直接修改数组变量。任何修改都会保留在功能范围内,但不会升级到父范围。

我用setter和getter创建了一个简单的holder对象来使它工作。

function scop1() {
/** simple class to hold vars **/
class holder {
 public $held = [];
 /** setter **/
 function update($what, $with) {
        $this->held[$what] = $with;
    }
 /** getter **/
 function get($what) {
    if(isset($this->held[$what])) return $this->held[$what];
    else return null;
 }
}
$var = new holder();
/** works **/
$var->update('hello','bye');
$x = function() use ($var) {
   /** modify parent scope **/
   $var->update('hello','hello');
};
/** call anomynous function **/
$x();
/** it should say hello hello in held **/
var_dump($var);
}
scop1();

实时样本:http://sandbox.onlinephpfunctions.com/code/d7464356c0712f2606b0f70ab952be4d782374dc

答案 3 :(得分:0)

配合使用&Closure即可解决问题。

function test()
{
  $var = 20;

  $anonymous = function () use (&$var) {
    $var++;
  };

  $anonymous();

  echo $var; // 21
}

如果只想传递值,请使用不带&的闭包

$anonymous = function () use ($var) { ... }