内部迭代变量用于更改其值

时间:2016-10-13 15:44:58

标签: php

我面对一些我不理解的事情,我尝试过很多事情。奇怪的是,这只发生在某些服务器上,而不发生在其他服务器上。所以我猜是在某种程度上与PHP配置有关。我有这段代码:

$j = 0 ;
                    for($m = $days - 1; $m >= 0 ; $m--){
                        $time1 = strtotime('-'.$m.' DAY');
                        $date_day = date('Y-m-d', $time1) ;

                        $$items_var[$j] = new stdClass();

                        $j++;
                    }

$ days的值是7.所以这是for循环,其中$ m从6变为0.嗯..它应该是。它开始没问题,它确实是6,5,4,3 ......然后就崩溃了。通常我得到的错误是 捕获致命错误:类stdClass的对象无法转换为字符串

所以,在某些时候(并且它看起来是随机的,因为在某些服务器中是在第二次迭代之后),$ m成为一个对象...... !!

这与您在代码中看到的分配有关:

$$ items_var [$ j] = new stdClass();

是的,这是一个双倍的$$。我有一个变量$ items_var,其值为“items”。因此,我正在尝试在名为$ items的数组中创建这个新的stdClass()。

这是代码搞乱的原因,但我不知道为什么。如果我删除此分配,代码将起作用。 $ m从6变为0.但由于某种原因,一些PHP安装正在搞乱这一点,这行代码将$ m的值更改为对象。

我无能为力。

1 个答案:

答案 0 :(得分:3)

确实如此:

  

是的,这是一个双倍的$$。我有一个变量$ items_var,其值为" items"。

这意味着你有:

$items_var = 'items';

您将该字符串用作数组:

$$items_var[$j] = new stdClass();

$j = 3时,您正在有效地运行

$m = new stdClass();

现在用一个对象覆盖你的for循环变量。在NEXT迭代中,您最终会执行

stdClass() >= 0

并产生您的确切错误。

这正是为什么你应该从不使用变量变量。你最终会遇到像这样的愚蠢/难以调试的错误。

评论后续:

PHP允许将字符串视为字符数组:

$foo = 'abcdefgh';
echo $foo[3] // outputs 'd'

变量变量采用变量的内容,并将其用作某些OTHER变量的名称:

$bar = 'hi mom';
$foo = 'bar';

echo $foo;  // outputs 'bar'
echo $$foo; // outputs 'hi mom'

所以给出:

$items_vars = 'items';
$j = 3;

此序列发生:

$$items_vars[$j] = new stdClass();
 ^-------------^
        |
$   'items'[3]   = new stdClass();
        |
$       m        = new stdClass();

$m = new stdClass();

并且繁荣,您在$m中使用的for($m=....)现已被删除。

代码解构。如果你拉开你的循环并将其写出来:

$items_vars = 'items';
$j = 0;
for($m = $days - 1; $m >= 0 ; $m--){
    $$items_var[$j] = new stdClass();

你最终这样做了:

               $$items_vars[$j]     = new StdClass:
j = 0; m =6    ${'items'[0]}  -> $i = new stdClas();
j = 1; m = 5   ${'items'[1]}  -> $t = new stdClass();
j = 2; m = 4   ${'items'[2]}  -> $e = new stdClass();
j = 3; m = 3   ${'items'[3]}  -> $m // BOOM

您没有将新的stdClass对象放入数组中。你的变量变量正在构建SINGLE LETTER变量名,并将stdClass放入每个变量名中。如果要将新类存储在数组中,则需要更像

的内容
array_push($$items_var, new stdClass());

将以

执行
array_push($items, new stdClass());