2

配列キーと同様に、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'] ...構文が必要であり、デコーダーに「配列」フラグを使用させる必要があります。

素晴らしい返信をありがとう!

4

1 に答える 1

4

xdebug が非標準のプロパティ名に問題があるかどうかはわかりませんが、これらのようなプロパティ名を意図的に使用したくないことは間違いありません。意味がありません。

OO の目的でオブジェクトを使用する場合は、それらのプロパティを正式に宣言します。この場合、「奇妙な」プロパティ名を使用することは完全に不可能であり、これ以上言うことはありません。

OO にオブジェクトを使用するつもりがない場合は$like->this$like['this']. 最初の形式は短く、私自身はそれを好みますが、プロパティを使用すると$with->{'strange-names'}、実際には配列へのアクセスよりもはるかに醜くなります。繰り返しますが、これを行うことから得られるものは何もありません。

いくつかの非常に例外的な状況では、そのようなプロパティ名の場合があります。たとえば、オブジェクトがそのプロパティの名前をデータベース テーブルの列名として使用する場合です。しかし、そのような場合でも、PHP のプロパティ名とデータベースの列名の間に変換レイヤーを追加する方が、すべてのステップで構文と格闘するよりもはるかに便利です。

おまけの議論:この質問を 1 回見ただけで気が変わらなければ、何も変わりません。これは特定のコーナー ケースに過ぎませんが、ここでは PHP について説明します。まれなケースは...避けるべきです。

于 2013-02-15T20:01:57.130 に答える