我array_walk
在类中使用 with 闭包时遇到了一个奇怪的问题。在我使用 php 版本5.4.7的开发环境中不会出现问题,但在我的部署环境5.3.3中会出现问题。
以下代码在我的生产机器上运行良好,但在我的部署环境中崩溃:
<?php
error_reporting(-1);
Class TestArrayWalk
{
/** @var null|array */
protected $userInput = null;
/**
* This expects to be passed an array of the users input from
* the input fields.
*
* @param array $input
* @return void
*/
public function setUserInput( array $input )
{
$this->userInput = $input;
// Lets explode the users input and format it in a way that this class
// will use for marking
array_walk( $this->userInput, function( &$rawValue )
{
$rawValue = array(
'raw' => $rawValue,
'words' => $this->splitIntoKeywordArray( $rawValue ),
'marked' => false,
'matched' => array()
);
}
);
}
public function getUserInput()
{
return $this->userInput;
}
protected function splitIntoKeywordArray( $input )
{
if ( ! is_string( $input )){ return array(); }
return preg_split('/(\s|[\.,\/:;!?])/', $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
}
}
$testArrayWalk = new TestArrayWalk();
$testArrayWalk->setUserInput(
array(
'This is a test input',
'This is another test input'
)
);
var_dump( $testArrayWalk->getUserInput() );
我得到的错误是:这是该测试类Using $this when not in object context on line 26
中的唯一用法。$this
我假设在我使用的版本之间发生了一些变化,这使得上述代码在我的开发环境中成为可能。
我还假设由于我无法更改部署环境(它的客户端并且他们不会更改它),因此我将不得不使用 aforeach
而不是array_walk
.
我的问题是:鉴于上述情况,这是否可能在 5.3.3 中使用array_walk
如果不是我如何foreach
以与使用 array_walk 相同的方式使用(更具体地说是&$rawValue
位)?
我的环境是:
- 我的开发环境是PHP 5.4.7版本
- 我的服务器(部署)环境是PHP 5.3.3版本
谢谢。
编辑 2
感谢所有帮助过的人。在您的帮助下,我完成了这项工作,并将我的工作代码发布到https://gist.github.com/carbontwelve/6727555以供将来参考。