Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
237 views
in Technique[技术] by (71.8m points)

php里面的形参和实参?

$arr = array(1, 2, 3);
function func ($brr) {
  $brr[0] = 10;
}
func($arr);
print_r($arr); 

// 结果如下
(
    [0] => 1
    [1] => 2
    [2] => 3
)

现象:原数组没有被改变
问题:php中好像,形参改变不了实参?实参给形参传值,是不是把实参复制了一份,传给了形参?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

其实这个涉及到的是一个引用传递的问题,在官方手册中明说了,对象 会被引用传递。

也就是说如果你传递的是一个对象,那么默认就会是原实例,如果是其他类型的,就将会是一个新的拷贝。

如你的代码,如果想要实现你想要的效果,只需要在方法声明的形参前面加上引用符号 &,即可。

$arr = array(1, 2, 3);
function func (&$brr) {
  $brr[0] = 10;
}
func($arr);
print_r($arr); 

这样,你就会得到一个理想的结果

Array
(
    [0] => 10
    [1] => 2
    [2] => 3
)

这个引用也是比较隐晦的,比如下图中,如果你不去运行一下,你很难猜出结果来。

参考资料


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...