【WordPressの動き方シリーズ】(3)オブジェクト・クラス・インスタンス

メインクエリ・サブクエリの詳細を始める前に、オブジェクト・クラス・インスタンスについて簡単に触れたいと思います。知っている人は飛ばしてください。大した内容ではありません。


WordPressではメインクエリのデータはWP_Queryというクラスのインスタンスオブジェクトとして作成されますと前の記事で紹介しました。

この「オブジェクト」とは、「モノ」という程度の意味です。つまり、クラスそのモノは「クラスオブジェクト」と呼びますし、クラスがインスタンス化されたモノは「インスタンスオブジェクト」と呼びます。

ただ、WordPress関連の書籍を見ていると、クラスのインスタンスオブジェクトの事を「〇〇オブジェクト」と省略して呼ぶことが多いようです。

この(クラスをインスタンス化した)オブジェクトには参照渡しという特徴があります。

通常の変数では、変数$bに$aを代入すると以下のように出力されます。

$a = 3;・・・①
$b = $a;・・・②
echo $b; // 3と出力される
$a = 4;
echo $a; // 4と出力される
echo $b; // 3と出力される

ところが、オブジェクトの場合は、$bに$aを渡したあと、$aのcakeプロパティの数値を変更すると、$bのcakeプロパティも変更されます

$a = new HogeClass(); //HogeClassクラスをインスタンス化して、変数$aに代入
$b = $a;
echo $a->cake; // 3
echo $b->cake; // 3

$a->cake = 5;
echo $a->cake; // 5
echo $b->cake; // 5  <= 3ではない!!

これは、クラスがインスタンス化されたオブジェクトを=で渡すときには、「作られたオブジェクトそのものを渡す」のではなく、「作られたオブジェクトが保存されているメモリ上の住所」を渡しているからです

 

そのため、$b = $a; と変数間てオブジェクトを渡すときも、「作られたオブジェクトの住所」だけが渡されるため、$aも$bも同じオブジェクトを参照することになります

このような、違う名前だけど同一のモノを扱えるようにすることを「参照する」とよび、PHPではインスタンスオブジェクトの入った変数を他の変数に代入するとき、必ず「参照渡し」となります

更に、

$a = new HogeClass(); //HogeClassクラスをインスタンス化して、変数$aに代入
$b = $a;

とした後で、

$b = 100000;

のように$bを再度定義してしまうと、この参照の関係は完全に解消されてしまい、$aも100000になってしまうという事はありません

この特徴は後で使いますので覚えておいてください。