PHP变量值更改

时间:2015-04-17 18:38:19

标签: php

使用代码解释此问题更简单。请注意,函数位于不同的文件中,并且包含在页面中。

$announcements = $dbc->query($q)->results(); //Returns array of objects
$announcements = prepareMessage($announcements); //Adds html tags to values
$latest = $announcements[0]; //Assign first index to variable
$announcements = truncate($announcements); //Truncate announcement text

function prepareMessage($message) {
    foreach($message as $values => $key) {
        $key->title = '<h2>'.$key->title.'</h2>';
        $key->name = '<p>'.$key->name.'</p>';
        $key->date = '<small>'.humanDate($key->date).'</small>';
    }

    return $message;
}

function truncate($message) {
    foreach($message as $values => $key) {
        $key->announcement = substr($key->announcement, 0, 50) . '...</p>';
    }

    return $message;
}

运行此行代码后,$ latest变量的值发生了变化

$announcements = truncate($announcements);

$ line之前的最新值

[announcement] =>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.

运行该行后的最新值

[announcement] =>
Lorem ipsum dolor sit amet, consectetur adipisc...

所以我的问题是,为什么最新的价值会发生变化?

3 个答案:

答案 0 :(得分:3)

因为$latest$announcements[0]的引用,而不是$announcements[0]的实际值。相反,请使用clone。在PHP5中,object assignments are always by reference

$latest = clone $announcements[0]; //Clone first object in array

答案 1 :(得分:2)

也许这个例子可以帮助您理解为什么$ latest正在发生变化:

如你的代码中所述,$ announcements是一个对象数组,简化如下:

$test = array(new StdClass(array('a'=>1)));
$latest = $test[0];
$test[0]->a = 3;
var_dump($latest);

var_dump会显示$ latest也已更改。这是因为实际上$ test [0]只是对StdClass实例的引用,并且该实例被复制到$ latest。当实例更改时,对实例的两个引用都将显示来自同一实例的相同值。

答案 2 :(得分:0)

您正在使用代码中的truncate函数将$ latest的值减少到50个字符。

要获得$ latest的完整价值,请使用以下代码:

$announcements = $dbc->query($q)->results(); //Returns array of objects
$announcements = prepareMessage($announcements); //Adds html tags to values
$latest = $announcements[0]; //Assign first index to variable


function prepareMessage($message) {
    foreach($message as $values => $key) {
        $key->title = '<h2>'.$key->title.'</h2>';
        $key->name = '<p>'.$key->name.'</p>';
        $key->date = '<small>'.humanDate($key->date).'</small>';
    }

    return $message;
}

或者您可以更改此行显示的字符数量(其中&#34; 50&#34;是要显示的字符数量,&#34; 0&#34;是从哪里开始)

$key->announcement = substr($key->announcement, 0, 50) . '...</p>';