2016-08-25 4 views
0

私は非常に奇妙なバグで立ち往生しています。私は次のようにタイトルのプロパティをプリントアウトしようとしているPHPはstdObjectの中に重複したプロパティを持つことができますか?

stdClass Object 
(
    [title] => Some Title 
    [body] => My body 
    [topic] => Topic 
    [dataType] => Survey 
    [csvrownum] => 1 
) 

print_r($row->title); 

しかしない何らかの理由で、私はこのようになります$行と呼ばれるオブジェクトを持っています何かを出力する。

$row->title = 'My Title'; 
print_r($row->title); 

驚くべきことに、それが働いていたが、なぜ:

は、それから私はこのようなものは、手動でタイトルプロパティを設定し、右の後にそれを印刷しようとしましたか?

$row->title = 'My Title'; 
var_dump($row); 

をそして、これは私が持っているものです::

class stdClass#391 (6) { 
    public $title => 
    string(3) "Some title" 
    public $body => 
    string(7) "My body" 
    public $topic => 
    string(6) "Topic" 
    public $dataType => 
    string(17) "Survey" 
    public $csvrownum => 
    int(1) 
    public $title => 
    string(8) "My title" 
} 

お知らせタイトルキーが異なると重複している手で、タイトルの変数を設定した後、私は、オブジェクトをのvar_dumpすることを決定し、これはより多くの奇妙なようにするには値。これが起こる可能性のある状態はありますか?

+1

あなたの他の 'title'には印刷できない文字があります – tkausl

+1

@tkauslは正しいと思います。 varダンプの最初のタイトルの長さは8でなく3であることに注意してください。おそらくエンコードの問題です。 –

答えて

4

いいえ、PHPではオブジェクトが重複するプロパティ名を持つことはできません。これは、PHPのオブジェクトが配列のように実装されているためです。それらはどちらも順序付きハッシュマップとして実装されています。ハッシュマップでは、同じハッシュを持つ2つのものが互いに上書きされます。

あなたのオブジェクトのプロパティ名には印刷できない文字が含まれている可能性があります。あなたは私たちがこのようなオブジェクトを持っていた場合

foreach($row as $key => $value) { 
    var_dump($key); 
} 

、たとえば、あなたは、それが上書きされます参照してくださいね...デバッグの目的のために、以下のような何かをすることによってより明確にこれを見ることができます。キーにvar_dumpを使用してforeachから

$row = new stdClass; 
$row->{"title\0"} = "First"; 
$row->title = "Second"; 

出力は、このことを明らかにする

$row = new stdClass; 
$row->title = "First"; 
$row->title = "Second"; 

しかし、このようなものは、より多くの欺瞞であるかもしれない... ...

 
string(6) "title" 
string(5) "title" 

通達1長さが6stringであり、他方が長さ5の文字列である。塩

穀物これは、デバッグ変数にしようとしたときにprint_rが故にだけ再帰プリント(名であるのに対し、var_dumpは具体的には、デバッグを目的として設計されていたとして、print_rのようなものを使用するよりもvar_dumpを使用するのが無難で )。 null,falseのような値や空の文字列を表示すると、デバッグに役立つ情報は得られませんが、var_dumpは役に立ちます。

+0

あなたは私の日を救った。私はdrupalモジュールを使用していました。自動的にcsvを解析します。 CSVはutf-8 BOMを使用してエンコードされていたため、最初のフィールドにアクセスできませんでした。それぞれを印刷した後、タイトルフィールドには8文字の長さがあり、2番目のタイトルフィールドには5文字しかありませんでした。 – Topicus

関連する問題