2013-03-12 54 views
1
$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)

如果我做的只是這樣的事情vardump變量:

$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) 

我只是想添加1到$ order_temp->順序,所以如果例如$ order_temp-> order = 2結果$ order = 3.

我在做什麼錯?

+0

你爲什麼鑄造到字符串? – DavidS 2013-03-12 15:15:10

+1

您忽略或忽略了'array(size = 1)'。另外,對於決定命名方法「get_latest_order_id」並讓它返回一個對象數組的庫dev,感到慚愧。 – 2013-03-12 15:21:59

回答

1

$order_temp不是對象,作爲錯誤信息說。當你嘗試訪問(或在這種情況下,增量)某個不是對象的屬性(因此不具有屬性)時,會出現此錯誤。但是,我可以告訴你在if語句中使用明確的比較,並且你的類型強制不符合你的期望。

使用明確比較:

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

..這可能不是你的錯誤的原因,但是這是很好的做法。

您在賦值中使用((string))將假定的對象變量強制轉換爲字符串,然後嘗試訪問其屬性。這不是你正在尋找的機器人。從PHP的角度來看,它似乎是你想這樣做的:

"0"->order++; 

......這是沒有意義的。

PHP使用類型雜耍[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 

...通過將增加運營商在轉讓前,該回報率將增量操作之後增加的變量。如果你把操作員放在最後,那麼返回的是變量之前的的增量操作。

這意味着你可以這樣做:

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

通過封閉在括號中的遞增運算符和類型轉換外,加上把遞增運算符作爲前綴,你會得到預期的結果。

文檔

+0

我已經更新了我的原始問題,你可以看到我是否var_dump $ order_temp我得到'object(stdClass)[28]'所以我認爲它是一個對象或不是? – Derfder 2013-03-12 15:20:32

+0

@Derfder更新回答 – 2013-03-12 15:39:53

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不是一個對象。所以這就是導致問題的原因。另外請注意,即使它有效,您也可能無法獲得預期的結果。

您的$訂單將包含舊的價值。看我的測試。

UPDATE

您$ order_temp的var_dump顯示,其陣列。你可以使用

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

解析錯誤:語法錯誤,意外'{';(我正在使用PHP 5.4.3 – Derfder 2013-03-12 15:11:05

+0

我已經更新了我的原始問題,你可以看到我是否var_dump $ order_temp我得到'object(stdClass)[28]'so我認爲這是一個對象嗎? – Derfder 2013-03-12 15:20:11

+0

我需要添加的順序是1另一個1所以結果$順序會是2 – Derfder 2013-03-12 15:21:28