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)

$order_temp->order に 1 を追加したいだけなので、たとえば $order_temp->order = 2 の場合、結果は $order = 3 になります。

私は何を間違っていますか?

4

2 に答える 2

1

$order_tempエラーメッセージにあるように、オブジェクトではありません。オブジェクトではない (したがってプロパティを持たない) 何かのプロパティにアクセスしようとすると (またはこの場合はインクリメントしようとすると)、このエラーが発生します。

何が何をするかわから$this->mdl_admin->get_latest_order_idないので、ここまでしかできませんが、if ステートメントで明示的な比較を使用すること、および型強制が期待どおりに機能していないことを伝えることができます。

明示的な比較を使用します。

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

.. それがバグの原因ではないかもしれませんが、それは良い習慣です。

(string)割り当てで ( ) を使用すると、推定されたオブジェクト変数が文字列に強制され、そのプロパティにアクセスしようとします。これはあなたが探しているドロイドではありません。PHP の観点からは、これを行いたいようです。

"0"->order++;

...意味がありません。

PHP は type 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);

インクリメント演算子を括弧で囲み、外側を型キャストし、さらにインクリメント演算子をプレフィックスとして配置すると、期待どおりの結果が得られます。

ドキュメンテーション

于 2013-03-12T15:12:05.853 に答える
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 はオブジェクトではありません。それが問題の原因です。また、動作しても期待した結果が得られない場合があることに注意してください。

$order には OLD 値が含まれます。私のテストを参照してください。

アップデート

var_dump$order_temp の は、それが配列であることを示しています。あなたが使用することができます

$order_temp[0]->order++;
$order = $order_temp[0]->order
var_dump($order);
于 2013-03-12T15:10:16.460 に答える