我有以下代码。
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改变父作用域中的变量,或者在这种情况下我唯一的手段是全局变量?
答案 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的范围文档中没有突出显示我的意思。
将变量范围扩展为匿名函数
$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) { ... }