2013-04-11 38 views
1

我想给一个数组元素赋值,该值是由一个带有引用参数的函数返回的。代码:通过函数返回引用分配数组值

function f(&$y) { 
    return $y; 
} 

$y = ''; 

$x = array(
     'a' => 1, 
     'b' => 2, 
     'c' => f($y) 
     ); 
var_dump($x); // 'c' is empty 

$y = 3; 

var_dump($x); // 'c' is still empty 

我很确定我在这种情况下得到了所有参考的东西都是错误的。即使我试图像function &f(&y) {}那样通过引用返回,仍然不起作用。

+2

[参考文献不是指针](http://php.net/manual/en/language.references.arent.php)。 – 2013-04-11 20:00:05

+0

函数f()返回$ y的值,并在$ x数组中设置。 $ y的第二个赋值完全不影响这个。但是这个理论是制造还是你实际上想要实现某些目标? – 2013-04-11 20:00:27

+0

您也需要通过参考返回。 – 2013-04-11 20:04:59

回答

1

首先,一个警告:这种代码太混乱了,你应该只在枪口威胁时才这样做。当他们不得不像这样调试代码时,你将来的自我会恨你。

也就是说,使这项工作,你需要“moar参考”:

function &f(&$y) { // two ref-signs here... 
    return $y; 
} 

$y = ''; 
$x = array(
    'a' => 1, 
    'b' => 2, 
    'c' => &f($y) // ..and one more here 
); 

然而,上述仍does not compile(我不知道为什么,会进行调查时,时间允许的话),因为它似乎你是在创建数组的过程中不允许这样做。但这个工程:

$y = ''; 
$x = array('a' => 1, 'b' => 2); 
$x['c'] = &f($y); // seems this guy needs to be alone 

$y = 3; 
print_r($x); 

See it in action

+0

这是因为PHP解析器。从技术上讲它是可能的:[''c'=>&$ {$ {''} =&f($ y)?!1:!1},'](http://stackoverflow.com/a/15957952/2261774 )。 – 2013-04-11 20:19:21

+0

@ M8R-1jmw5r:我担心它会是这样的,因为PHP(显然没有技术原因,这不会飞)。坦率地说,我不会因运输这种代码而被迫停工,而是努力工作+1。 – Jon 2013-04-11 20:27:07

+0

谢谢,正是我无法想象为什么它不起作用。 – 2013-04-11 20:29:49

2

你应该尝试

$x = array(
    'a' => 1, 
    'b' => 2, 
    'c' => &$y 
    ); 
+0

不,函数做的不是返回$ y – Stingus 2013-04-11 20:29:07

-1

根据在PHP手册看一眼,它看起来像你的阵列()语法缺少一个逗号。

$x = array(
    'a' => 1, 
    'b' => 2, 
    'c' => f($y) 
    ); 

实际上应该是

$x = array(
    'a' => 1, 
    'b' => 2, 
    'c' => f($y), 
    ); 

来源:http://php.net/manual/en/language.types.array.php

我已经很多年没有写PHP,我只是通过例子去笔者提出。

+2

错误的明码值。逗号是可选的,没有必要。 – bwoebi 2013-04-11 20:05:47

+0

不回答问题,无论如何都是错误的。 – Alfwed 2013-04-11 20:07:34

3

如果你想这与一个函数调用(你还可别名$y直接),那么你就需要参考使用return(见:Returning References),看到&标志函数名前:

function &f(&$y) { 
    return $y; 
} 

还需要别名引用(这需要一些特殊的处理,使PHP解析器允许这样):

$y = ''; 

$x = array(
     'a' => 1, 
     'b' => 2, 
     'c' => &${${''}=&f($y)?!1:!1}, 
); 

See it in action

相关问题