PHP子函数无法访问父函数变量$names_from_source问题求助
问题原因及解决办法
核心原因
你遇到的是PHP变量作用域的典型问题:global关键字引用的是全局作用域的变量,而非父函数内部的局部变量。你的$names_from_source是get_all_duplicated函数里的局部变量,和全局作用域的变量完全是两个独立的存在,所以回调里用global声明后,找不到对应的全局变量,自然返回NULL。
解决办法
推荐使用PHP闭包的use关键字来捕获父函数的局部变量,这是PHP 5.3及以上版本处理这类场景的标准方式:
function get_all_duplicated($source_array) { $names_from_source = array_column($source_array, 'name'); // 用use($names_from_source)捕获父函数变量 $duplicated_items = array_filter($source_array, function($item) use ($names_from_source) { // 这里可以正常使用$names_from_source return count(array_keys($names_from_source, $item['name'])) > 1; }); return $duplicated_items; }
如果一定要用全局变量(不推荐,会增加代码耦合性),需要先把$names_from_source声明为全局变量:
function get_all_duplicated($source_array) { global $names_from_source; // 先在父函数里声明为全局 $names_from_source = array_column($source_array, 'name'); $duplicated_items = array_filter($source_array, function($item) { global $names_from_source; // 现在能拿到全局的变量了 return count(array_keys($names_from_source, $item['name'])) > 1; }); return $duplicated_items; }
额外提示
优先用use的方式,全局变量会让代码的依赖关系变得模糊,后续维护容易出问题。另外,如果你需要在回调里修改父函数的变量,可以用use(&$names_from_source)(传引用),不过这个场景里你只需要读取,所以普通传值就够了。
内容的提问来源于stack exchange,提问作者Python
相关产品推荐
相关产品推荐

