如何改写PHP代码中的each()函数以适配PHP 8.2版本?
适配PHP 8.2的代码修改方案
问题根源
each()函数在PHP 7.2已被标记为废弃,PHP 8.0及以上版本直接移除了该函数,原代码的while循环依赖此函数,必须替换为PHP 8.x支持的遍历方式。你之前的改写错误地颠倒了遍历对象,导致逻辑失效。
修正后的完整代码
protected function callActivities() { do_action( 'vc_mapper_call_activities_before' ); // 替换each()循环为foreach,遍历原$activity数组 foreach ($activity as $key => $value) { // 保留$this->init_activity的赋值,模拟each()返回的结构(如果后续逻辑依赖此变量) $this->init_activity = [$key, $value]; // 从当前遍历的value中解构变量,替代原错误的$activity[1] list( $object, $method, $params ) = $value; if ( 'mapper' === $object ) { switch ( $method ) { case 'map': WPBMap::map( $params['tag'], $params['attributes'] ); break; case 'drop_param': WPBMap::dropParam( $params['name'], $params['attribute_name'] ); break; case 'add_param': WPBMap::addParam( $params['name'], $params['attribute'] ); break; case 'mutate_param': WPBMap::mutateParam( $params['name'], $params['attribute'] ); break; case 'drop_all_shortcodes': WPBMap::dropAllShortcodes(); break; case 'drop_shortcode': WPBMap::dropShortcode( $params['name'] ); break; case 'modify': WPBMap::modify( $params['name'], $params['setting_name'], $params['value'] ); break; } } } }
关键改动说明
- 替换遍历逻辑:用
foreach ($activity as $key => $value)替代while + each(),这是PHP 8.x推荐的数组遍历方式,同时完整保留原遍历的键值对信息。 - 修正变量解构:原代码中
list(...) = $activity[1]是错误的($activity是整个数组,$activity[1]仅取固定索引元素),改为从当前遍历的$value中解构,对应原each($activity)返回的[1]位置的value值。 - 保留状态变量:如果后续代码依赖
$this->init_activity存储当前遍历的键值对,我们通过$this->init_activity = [$key, $value]模拟each()返回的数组结构,确保逻辑兼容。
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

