如果我在php中有一个函数从解析xml创建几个对象数组,我该如何将这些数组作为引用返回?
我是否需要调用new来分配数组?如何在函数中定义它们?
function ParseConfig($rawxml, &$configName, &$radioArr, &$flasherArr, &$irdArr)
抱歉,我的意思是返回多个数组作为参数引用。
如何在函数内部创建数组?或者我可以开始将其用作数组吗?
答案 0 :(得分:2)
在这种情况下无需使用引用。 PHP使用写入机制上的副本,该机制还跟踪指向当前值的项目数。如果从函数返回一个值,并将该结果赋给变量,refcount
仍然只有一个,因为函数返回时函数中使用的变量将被销毁。您可以安全地编辑包含函数返回值的变量,而不必担心浪费内存。
样品测试:
function getaz() {
$array = range('a','z');
echo '2: ', memory_get_usage(), "\n";
return $array;
}
echo '1: ', memory_get_usage(), "\n";
$p = getaz();
echo '3: ', memory_get_usage(), "\n";
$p[0] = '3';
echo '4: ', memory_get_usage(), "\n";
$p = array_merge($p, range('A','Z'));
echo '5: ', memory_get_usage();
输出:
1: 337304 [initial]
2: 340024 [inside function, value is created]
3: 340072 [outside function, value is assigned]
4: 340072 [element modified but remains same size]
5: 342696 [array extended]
如果我将函数更改为按引用返回,则会得到以下内容:
1: 337312 [it took 8 bytes more memory to define the function]
2: 340032 [accounting for the extra 8 bytes, no change]
3: 340080 [accounting for the extra 8 bytes, no change]
4: 340080 [accounting for the extra 8 bytes, no change]
5: 342704 [accounting for the extra 8 bytes, no change]
希望这有帮助!
如需了解更多关于如何以及为何如此运作的信息,请查看this shameless blog plug that explains a little bit about how PHP deals with variables and values。
答案 1 :(得分:1)
return &$array;
但是只返回$ array恕我直言
答案 2 :(得分:0)
从函数返回的任何数组都将通过引用返回,直到您修改该数组之前的数组:
$myArray = functionThatReturnsArray(); //$myArray is a reference to the array returned
echo $myArray[0]; //still a reference
$myArray[0] = 'someNewValue'; //from here $myArray will be a copy of the returned array
答案 3 :(得分:0)
您可以在参数列表中指定数组类型(自PHP 5.1起),如果这样做,您可以立即开始将其用作数组:
function my_function( array &$arr ) {
$arr[0] = 'someValue';
}
如果不这样做,您应该在功能顶部进行检查:
function my_function( &$arr ) {
if( !is_array($arr) ) $arr = array(); // or generate an error or throw exception
$arr[0] = 'someValue';
}
答案 4 :(得分:0)
我没有注意到你编辑了你的问题,这完全改变了一些事情。你有两个不错的选择:
在函数顶部显式更改它们:
function foo($bar, &$baz, &$qux) {
$baz = $qux = array();
}
也许这是介绍对象的好地方?
class parseConfig {
protected $rawXml;
protected $configName;
protected $radioArr = array();
protected $flasherArr = array();
protected $irdArr = array();
public function __construct($raw_xml = null) {
if (!is_null($raw_xml)) {
$this->rawXml = $raw_xml;
$this->parse();
}
}
public function parse($raw_xml = null) {
if (!is_null($raw_xml)) {
$this->rawXml = $raw_xml;
}
if (empty($this->rawXml)) {
return null;
}
$this->configName = '';
$this->radioArr =
$this->flasherArr =
$this->irdArr = array();
// parsing happens here, may return false
return true;
}
public function setRawXml($raw_xml) {
$this->rawXml = $raw_xml;
return $this;
}
public function getRawXml() {
return $this->rawXml;
}
public function getRadioArr() {
return $this->radioArr;
}
public function getFlasherArr() {
return $this->flasherArr;
}
public function getIrdArr() {
return $this->irdArr;
}
}