2024年06月14日
6.PHPのオブジェクトとループ処理
配列の中の「連想配列」と似ているが異なる「オブジェクト」があります。
WordPressはこの「オブジェクト」で作成されています。
ここではこの「オブジェクト」について解説していきます。
配列とオブジェクトの見分け方
配列やオブジェクトを print_r() で表示すると何が使われているのかを判断できます。
種類 | データ構造 |
添字配列 添字と値のペアで配列として登録されています。 Array()で表示されます。 |
Array (
[0] => リンゴ
[1] => みかん
[2] => パイナップル )
|
連想配列 キーと値のペアで配列として登録されています。 Array()で表示されます。 |
Array (
[apple] => リンゴ
[orange] => ミカン
[pineapple] => パイナップル )
|
オブジェクト キーと値のペアでオブジェクトとして登録されています。 オブジェクト名 Object ()で表示されます。 |
my_class Object (
[apple] => リンゴ
[orenge] => みかん
[pineapple] => パイナップル )
|
■オブジェクトは オブジェクト名 Object が表示されます。
オブジェクトの作成とデータの取得方法
ここではオブジェクトの作り方と読込み方を解説します。
1.オブジェクトの作成
<?php class my_class{ public $apple = 'リンゴ'; public $orenge = 'みかん'; public $pineapple = 'パイナップル'; } $my_object = new my_class;// オブジェクトのインスタンス化(実体化) ?> <pre> <?php print_r($my_object);?> </pre>
■3行目~5行目の[$apple]等はキーではなくプロパティと呼ばれ、これには下記のアクセス宣言が必要になります。
アクセス装飾子 | 説明 |
public | 何処からでもアクセスが可能です。 |
protected | そのクラス自身と親子関係にあるクラスのみアクセスが可能です。 |
private | そのクラス自身のみがアクセス可能です。 |
※ここでは[public]を利用します。尚、他のアクセス権限の説明は省略します。
■7行目の[$my_object = new my_class;]は、オブジェクトの実体化で、これでプログラムから[$my_object]が利用できる様になります。
■下記が表示されます。
my_class Object ( [apple] => リンゴ [orenge] => みかん [pineapple] => パイナップル )
2.オブジェクトからのデータの取り出し
オブジェクトからのデータ取り出しは下記の[演算子]を利用します。
事例 | 解説 |
配列名->'プロパティ名' | ->は、アロー演算子と呼ばれています。
オブジェクトからプロパティ名を指定して、データを取り出します |
1項で作成したオブジェクトから、データを読み込む方法は下記になります。
<?php $data = $my_object -> apple; echo $data; ?>
■リンゴが表示されます。
3.foreachループでデータを取得する。
配列操作と同様にオブジェクトでも foreach が利用できます。
<?php foreach($my_object as $key => $val): // 命令の終わりは(:コロン)です echo '[' . $key .']=' . $val . '<br>'; endforeach; // 命令の終わりは(;セミコロン)です ?>
結果は下記になります。
[apple]=リンゴ
[orenge]=みかん
[pineapple]=パイナップル
4.Whileループでデータを取得する。
配列操作と同様にオブジェクトでも While が利用できます。
Whileは、オブジェクトが持つ内部ポインタを制御してループを回します。
内部ポインタ関数 | 説明 |
current() | 引数で指定した配列の内部ポインタが指している値を返します。
データが無い場合はfalseが返ります。 |
key() | 引数で指定した配列の内部ポインタが指しているキーを返します。
キーが無い場合はnullを返します。 |
next() | 引数で指定した配列の内部ポインタを一つ進めて、値を返します。
これ以上ポインタが進められない場合はfalseが返ります。 |
上記の関数を使ったプログラムが下記になります。
<?php while(current($my_object)): $key = key($my_object); $val = current($my_object); echo '[' . $key .']=' . $val . '<br>'; next($my_object); // 内部ポインタを進めます。※重要です endwhile; ?>
■6行目の[next($my_object);]を省略すると2行目の[current($my_object)]が常にtrueになり、無限ループになるので注意が必要です。
■結果は下記になります。
[apple]=リンゴ
[orenge]=みかん
[pineapple]=パイナップル
WordPressの文書の読み込みの解説
WordPress文書データはオブジェクトで作成されており、読み込みは While を利用します。
但し、WordPressのグローバル変数を操作する為に current() と next() に相当する専用関数が用意されています。
WordPress関数 | 解説 |
have_posts() | [$wp_query]の内部ポインタが指しているドキュメントがあるか否かをチェックする関数です。
あった場合は true、無い場合は false を返します。 |
the_post() | whileループの中で使える関数で、[$wp_query]の内部ポインタが指しているデータを[$post]に取り込みます。
更に、[$wp_query]の内部ポインタを1つ更新します。 |
尚、WordPressが利用している主要なグローバル変数は下記になります。
グローバル変数 | 解説 |
$wp_query | DBに問い合わせした結果の情報がセットされているオブジェクト
例えばカテゴリ表示の場合は、対象のカテゴリの文書が総て登録されています。 |
$post | $wp_queryの中から選択された情報がセットされたオブジェクト
例えばカテゴリ表示の場合は、$wp_queryの中の先頭の文書が取り出されています。 |
■上記以外にWordPressが利用しているグローバル変数一覧
上記の関数を使った文書の読み込みプログラムは下記の様になります。
<?php while ( have_posts() ) : // 内部ポインタが指す$wp_queryにデータがあるかをチェックしています the_post(); // 投稿の情報を[$post]に取り込み、[$wp_query]の内部ポインタを1つ更新します // ドキュメント内の情報の表示等を記述します。 endwhile; ?>
上記で[the_post()]で取り込まれた[$post]のデータ(※参考)
プロパティ | データ型 | 解説 |
post_type | string | 投稿情報タイプ
投稿:'post' 固定ページ:'page' |
ID | int | 投稿ID又はページID |
post_title | string | 投稿タイトル又はページタイトル |
post_name | string | 投稿スラッグ又はページスラッグ
※パーマリンク設定で%postname%を指定している場合 |
post_content | string | 投稿内容 |
post_excerpt | string | 抜粋内容 |
post_date | string | 投稿日時 |
post_date_gmt | string | 投稿日時(GMT) |
post_modified | string | 更新日時 |
post_modified_gmt | string | 更新日時(GMT) |
その中で、IDを取得する場合は下記になります。
<?php $id = $post -> ID;?>