php通过引用传递不工作

时间:2012-01-14 15:40:53

标签: php reference pass-by-reference

我只是试图通过尝试在php.net上找到的一些示例来理解PHP中的引用传递。我在php网站上找到了一个例子,但它不起作用:

function foo(&$var)
{
    return $var++;
}

$a=5;
echo foo($a); // Am I not supposed to get 6 here? but I still get 5

这是一个here

的例子

有人可以告诉我为什么变量$ a变为5而不是6?

6 个答案:

答案 0 :(得分:6)

您的代码和示例代码不一样。难道他们表现得与众不同吗?

要查看您期望的行为,您必须将$var++更改为++$var

这里发生的是,虽然函数返回后$a 的值 6,但返回的值是5,因为后增量运算符({{1 }})工作。你可以用以下方法测试:

$var++

答案 1 :(得分:1)

因为$a++返回$a,然后递增1。

要做你想做的事,你需要做++$a

http://www.php.net/manual/en/language.operators.increment.php

答案 2 :(得分:1)

这与increment operator有关,而不是通过引用传递。如果您查看手册,您将看到展示您想要的行为,您必须更改foo()以使用预增量而不是后增量,如下所示:

function foo(&$var)
{
    return ++$var;
}

现在:

> $a = 5;
> echo foo($a);
6

答案 3 :(得分:0)

不,这很好用。 $var++返回$var的值,然后递增变量。因此返回的值为5,这是echo。变量$a现在已更新为6

答案 4 :(得分:0)

尝试回显实际变量:

echo $a; // 6

如果在返回之前递增,那么您的示例将起作用:

return ++$var;

答案 5 :(得分:0)

与问题没有直接关系,只与主题有关。 似乎有一个PHP错误...

one => 4
two => 5
three => 5

(changing '$v' to '$val' (or some other variable name other than '$v')       
in the second (i.e. last) 'foreach' will result in the expected correct
output (one => 4 two => 5 three => 6)

输出:

var nextButton = document.getElementById('next-feeds');
    var imgs = [];							// store the images for caching
    var images = [];
    var currentPage = 1;

    var feed = new Instafeed({
        get: 'tagged',
        tagName: 'ajith',
        clientId: '467ede5a6b9b48ae8e03f4e2582aeeb3',
        resolution: 'thumbnail',
        limit: 60,
        mock: true,
        template: '<a href="{{link}}" target="_blank"><img src="{{image}}" class="instagramImg"/></a><label>Liked by <b>{{model.likes.count}}</b> people</label>',
        cachedNext: function () { 	// read the cached instagram data
            var nextImages = imgs.slice((currentPage - 1) * feed.options.limit, (currentPage) * feed.options.limit);
            $("#instafeed").html(nextImages);
        },
        after: function () {
            if (images.length < 300)
            {
                feed.next();
            }
            else
            {
                var result;
                images.sort(compare);
                for (i = 0; i < images.length; i++) {
                    image = images[i];
                    result = this._makeTemplate(this.options.template, {
                        model: image,
                        id: image.id,
                        link: image.link,
                        image: image.images[this.options.resolution].url,
                        likeCount: image.likes.count
                    });
                    imgs.push(result);
                }
                var imgsPerPage = imgs.slice((currentPage - 1) * feed.options.limit, (currentPage) * feed.options.limit);
                $("#instafeed").html(imgsPerPage);
            }
        },
        success: function (data) {
            images.push.apply(images, data.data);
        }
    });

    feed.run();

    // bind the next button
    nextButton.addEventListener('click', function () {
        $("#instafeed").fadeOut(100);
        $("#instafeed").empty();
        $("#instafeed").fadeIn(100);
        currentPage++;

        feed.options.cachedNext();
    });

    function compare(a, b) {
        // alert(a.likes.count);
        if (a.likes.count < b.likes.count)
            return -1;
        if (a.likes.count > b.likes.count)
            return 1;
        return 0;
    }