今回はPHPでオブジェクトから連想配列へ、または連想配列からオブジェクトへ変換する方法について解説していきたいと思います。
多くのプログラミング言語で採用しているオブジェクトですが、PHPでも扱うことができます。一般的にオブジェクトはオブジェクトとして、連想配列は連想配列として、それぞれで扱うものですが、相互で変換し合うことができれば非常に便利です。
オブジェクトと連想配列とを互いに変換する方法を学ぶことで、効果的なプログラム開発を目指していきましょう。
目次
オブジェクト(Object)とは
まずオブジェクトについて簡単に解説していきたいと思います。
多くのプログラミング言語ではクラスという仕組みがあります。クラスとは「オブジェクトを生成するための設計図」という説明がよくなされていますが、いろいろな関数を1つにまとめたパッケージくらいに考えておいてください。
クラスを使わない場合は個々の関数にアクセスして結果を得ていますが、クラスでは関連する複数の関数を1つにまとめることで便利に利用できるようになっています。このクラスからオブジェクトを生成することで変数のように振る舞うことができます。
以下の例のように、Class1というクラスがあったとして、それを1〜3行目でオブジェクトを生成しています。obj1、obj2、obj3という3つのオブジェクトが作られたわけです。これら生成されたオブジェクトは個々にクラスで定義された関数や変数にアクセスできるようになります。
1 2 3 4 5 6 7 |
$obj1 = new Class1(); $obj2 = new Class1(); $obj3 = new Class1(); class Class1{ ... } |
PHPにおけるオブジェクト指向プログラミングの基本
次にPHPにおけるオブジェクト指向プログラミングの基本について述べていきたいと思います。
まずはオブジェクトの設計図となるクラスの記述方法について以下の例に従って解説します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
class Member{ //インスタンス変数 public int $id; public string $name; public int $age; //コンストラクタ public function __construct(int $id, string $name, $age){ $this->id = $id; $this->name = $name; $this->age = $age; } //メソッド public function getInfo(){ return $this->id ." ". $this->name. " ". $this->age; } } $user1 = new Member(1, "山田太郎", 23); echo $user1->id. "\n"; echo $user1->name. "\n"; echo $user1->age. "\n"; echo $user1->getInfo(). "\n"; $user1->age = 29; echo $user1->getInfo(). "\n"; |
出力結果は以下のとおりとなります。
1 2 3 4 5 |
1 山田太郎 23 1 山田太郎 23 1 山田太郎 29 |
それでは解説していきましょう。
まずクラスの中身からですが、以下の3行はインスタンス変数と言ってオブジェクトごとに設定できる変数です。publicで宣言しているのでオブジェクトの外側から読み書き可能です。privateで宣言している場合は直接アクセスできないので後述するメソッドを介して書き換えることになります。
1 2 3 4 |
//インスタンス変数 public int $id; public string $name; public int $age; |
次にコンストラクタです。コンストラクタはオブジェクト生成時に呼び出され初期化するためのものです。__constructという名前を付けることでコンストラクタと認識されます。
今回の例ではインスタンス変数に一括でデータを入力するようになっています。もちろんpublicな変数なのでコンストラクタで設定しなくとも1つ1つ入力することもできますが、コンストラクタで一括処理するのが一般的です。
1 2 3 4 5 6 |
//コンストラクタ public function __construct(int $id, string $name, $age){ $this->id = $id; $this->name = $name; $this->age = $age; } |
最後にメソッドです。クラス内の関数で任意の名前を付けることができますし複数作ることもできます。ここではインスタンス変数を連結して返す関数にしました。このようにインスタンス変数だけでは表現しきれない複雑な演算をメソッドで作ることができます。
1 2 3 4 |
//メソッド public function getInfo(){ return $this->id ." ". $this->name. " ". $this->age; } |
それではこのクラスを使ったオブジェクトの例について解説しましょう。
まずオブジェクトを生成するために以下のように初期化します。$user1というオブジェクトは、Memberクラスに以下のようなデータを渡したことでこれら値がインスタンス変数にセットされることになります。
1 |
$user1 = new Member(1, "山田太郎", 23); |
生成したオブジェクト$user1から以下のようにインスタンス変数やメソッドを呼び出して出力することができます。
1 2 3 4 5 6 7 8 9 |
echo $user1->id. "\n"; echo $user1->name. "\n"; echo $user1->age. "\n"; echo $user1->getInfo(). "\n"; //出力結果 //1 山田太郎 23 //1 //山田太郎 //23 |
また、インスタンス変数はpublicなため、以下のように書き換えることもできます。
1 2 3 4 |
$user1->age = 29; echo $user1->getInfo(). "\n"; //出力結果 //1 山田太郎 29 |
以上がPHPにおけるオブジェクト指向プログラミングの初歩的な解説でした。次は本題の配列への変換について説明します。
オブジェクト(Object)から配列(Array)に変換する方法
オブジェクトを配列に変換できたらとても便利です。なぜなら配列を制御する様々な関数が使うことが出来るからです。
オブジェクトから配列に変換する方法はとても簡単で、以下の構文で変換できます。
1 |
配列変数 = (array) オブジェクト; |
オブジェクトの前に(array)を付ければ配列を返してくれます。実際の例は下記のとおりです。
1 2 3 4 |
$array = (array) $user1; print_r($array); echo $array["name"] ."\n"; |
出力結果は以下の通りです。
1 2 3 4 5 6 7 |
Array ( [id] => 1 [name] => 山田太郎 [age] => 23 ) 山田太郎 |
オブジェクトが連想配列となりました。当たり前ですがメソッドのような制御系を配列に変えることはできません。あくまでインスタンス変数を配列化するに留まります。
配列(Array)からオブジェクト(Object)に変換する方法
次に、配列からオブジェクトへの変換方法について紹介したいと思いますが、残念ながらオブジェクトから配列への変換のように簡単ではありません。
以下のように自作の関数で力技でオブジェクトに変換させています。他にもいくつかテクニックはあるようですが速度面を考えると以下のようにforeachで要素を1つ1つ取り出してオブヘクトへ追加していった方が良さそうです。
1 2 3 4 5 6 7 8 9 10 |
$obj = toObject($array); print_r($obj); function toObject($array) { $obj = new stdClass; foreach($array as $k => $v) { $obj->{$k} = $v; } return $obj; } |
出力結果はこちらです。オブジェクト化されたことがおわかりいただけたかと思います。
1 2 3 4 5 6 |
stdClass Object ( [id] => 1 [name] => 山田太郎 [age] => 23 ) |
まとめ
いかがでしょうか。今回はPHPにおけるオブジェクト指向プログラミングの初歩的な解説と、今回はPHPでオブジェクトから連想配列へ、または連想配列からオブジェクトへ変換する方法について解説しました。
もちろんオブジェクトのままでも処理することは可能ですが、複雑な処理をするような場合は一旦配列に変換してからの方が結果的に速く処理できる場合もあるので、状況に応じて使い分けすると良いでしょう。