配列キーと同様に、PHPオブジェクトのプロパティ名を柔軟に使用するのに問題があります。
私の理解では、配列キーは任意の文字列または整数にすることができます。
$arr = array("crash-me" => "value");
有効なキーと値のペアです。
これをオブジェクトに「キャスト」すると、次のようになります。
$obj = (object) $arr;
キー文字列のダッシュが原因で、違法なことをしたことがありますか?
簡単な例は私のジレンマを示しています:
<?php
error_reporting(-1);
$obj = new stdClass;
$prop = "crash-me";
$arr = array();
$obj->$prop = "no crash";
$obj->$prop = $arr; // bp here and $obj->$prop is correct
print_r($obj); // bp here, inspect $obj->$prop and... xdebug/php will crash.
exit;
これにより、print_r()の前に$ objの値を検査するときに、xdebugを使用してeclipse-pdtがクラッシュします。
ただし、bpがない場合、コンテンツは終了時にprint_r()から正しく出力されます。
stdClass Object ( [crash-me] => Array ( ) )
プロパティに割り当てるときに配列に何かを詰め込むと、問題がないことに注意してください。
$obj = new stdClass;
$prop = "crash-me";
$arr = array("works_ok");
$obj->$prop = "no crash";
$obj->$prop = $arr;
print_r($obj);
exit;
結論として、ダッシュと、場合によっては配列キーに似た他の句読点を含むプロパティ名を使用したいと思います。出来ますか?または、空の配列を割り当てることによって違法なことをしていますか?その場合、エラーはキャッチされませんか?
よろしくお願いします!
編集時に、パズルの別の部分を忘れました-以下のコードはクラッシュしません。この場合、プロパティ名にはダッシュがありませんが、配列キーは空です!
$obj = new stdClass;
$prop = "crash_me"; // note underscore
$arr = array();
$obj->$prop = "no crash";
$obj->$prop = $arr; // bp here and $obj->$prop is correct
print_r($obj); // bp here, inspect $obj->$prop and... no crash!
exit;
混乱させて申し訳ありません!それはおそらく私が見逃している明らかなものです。
2回目の編集-
明確にするために、私はjson_decode()からプロパティ名を読み取り、配列に変換せずにオブジェクトを使用することを望んでいました。これは、jsonデータファイルからのキーを使用した動的コード生成の実験でした。以下の説明によると、これをPHPで続行する場合は、$ arr ['key1'] ['key2'] ...構文が必要であり、デコーダーに「配列」フラグを使用させる必要があります。
素晴らしい返信をありがとう!