我面对一些我不理解的事情,我尝试过很多事情。奇怪的是,这只发生在某些服务器上,而不发生在其他服务器上。所以我猜是在某种程度上与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的值更改为对象。
我无能为力。
答案 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());