消息:尝试增加/减少非对象的属性

时间:2013-03-12 15:07:42

标签: php operators

$order_temp = $this->mdl_admin->get_latest_order_id($_POST['parent_id']);

if ($order_temp) {
    $order = (string)$order_temp->order++;
    var_dump($order);
    die();
}

上面的代码产生了这个错误:

Message: Attempt to increment/decrement property of non-object 

vardump是string '' (length=0)

如果我做这样的事情来推翻变量:

$order_temp = $this->mdl_admin->get_latest_order_id($_POST['parent_id']);
if ($order_temp) {
   var_dump($order_temp);
   die();
}

输出是:

array (size=1)
  0 => 
    object(stdClass)[28]
      public 'id' => string '16' (length=2)
      public 'name' => string 'sssssssssssssss' (length=15)
      public 'slug' => string 'aaaaaaaaa' (length=9)
      public 'title' => string 'aaaaaa' (length=6)
      public 'body' => string '<p>asdas asd asd </p>' (length=21)
      public 'order' => string '1' (length=1)
      public 'parent_id' => string '5' (length=1)

我只想在$ order_temp-&gt;订单中添加1,以便例如$ order_temp-&gt; order = 2结果$ order = 3.

我做错了什么?

2 个答案:

答案 0 :(得分:1)

<?php
class Test
{
    public $order = 10;
}

$order_temp = new Test();
$order = (string)$order_temp->order++;
var_dump($order);
//string(2) "10" 

$order = (string)$order_temp->order;
var_dump($order);
//string(2) "11" 
?> 

您的$ order_temp不是对象。这就是导致问题的原因。另请注意,即使有效,您也可能无法获得预期的结果。

您的$订单将包含OLD值。看我的测试。

更新

$ order_temp的var_dump显示它是一个数组。你可以用

$order_temp[0]->order++;
$order = $order_temp[0]->order
var_dump($order);

答案 1 :(得分:1)

$order_temp不是对象,正如错误消息所示。当您尝试访问(或在此情况下,递增)某个不是对象的属性(因此没有属性)时,会出现此错误。

不知道$this->mdl_admin->get_latest_order_id做了什么,我只能到目前为止,但是,我可以告诉你在if语句中使用显式比较,并且你的类型强制没有达到预期的效果。

使用显式比较:

if (is_object($order_temp) === true) 

..这可能不是你的错误的原因,但这是一个很好的做法。

您在赋值中使用((string))会将假定的对象变量强制转换为字符串,然后您尝试访问该属性。这不是你要找的机器人。从PHP的角度来看,你想要这样做:

"0"->order++;

......这没有意义。

PHP使用类型juggling [doc]。无论对象的属性order是否以字符串形式开头,只要使用增量运算符++,PHP就会将类型变为整数。如果你想要一个字符串,你所要做的就是开始像字符串一样处理它:

$order_temp->order++; // <-- variable is an integer, $order_temp->order === 1
$order_temp->order .= " and bob's your uncle"; // <-- variable is a string, $order_temp->order === "1 and bob's your uncle"

因此,在PHP中很少需要类型强制。

最后,您可以完全按照您尝试的方式执行此操作,但您必须了解增量++运算符的工作方式。

$number = 0;
$output = $number++;
echo "Output: ".$output; // Output: 0

$number = 0;
$output = ++$number;
echo "Output: ".$output; // Output: 1

...通过将增量运算符放在赋值的FRONT处,返回将是增量操作后增量变量 。如果你把操作符放在最后,那么返回是增量操作之前的变量

这意味着你可以这样做:

$order_number_as_string = (string) (++$one_order->order);

通过将增量运算符括在括号中并输入外部类型,再加上增量运算符作为前缀,您将获得预期的结果。

<强>文档