こんにちはフロントエンドエンジニアのまさにょんです!
今回は、PHPのオブジェクトの使い方やstdClassについて、また配列からオブジェクトへの変換などについて解説していきます。
目次
PHPのオブジェクト(Object)とは?
PHP のオブジェクト型(Object)の種類は「複合型」で「データ構造」(プロパティ)と「処理系」(メソッド) が合わさったデータ型です。
PHPでオブジェクト(Object)を作成する
PHPでオブジェクト(Object)を作成するには、基本的に最初に「クラス」を定義します。
一度クラスを定義し、「new」 キーワードを使用して、オブジェクトを作成します。
// [ PHPでオブジェクト(Object)を作成する ]
// 1. Objectの元となる class を作成する
class Robotama{
public $name = "ロボ玉";
public $like = "ひまたね";
public $from = "グンマー帝国";
public $cost = null;
}
// 2. オブジェクト(クラス)は new でインスタンス化(実体化)
$robotama = new Robotama;
// 型を確認
echo gettype($robotama)."\n";
// [ 実行結果 ]
// object
// 3. インスタンス(実体)の中身を表示 => 構造を確認
var_export($robotama);
echo "\n";
// [ 実行結果 ]
// Robotama::__set_state(array(
// 'name' => 'ロボ玉',
// 'like' => 'ひまたね',
// 'from' => 'グンマー帝国',
// 'cost' => NULL,
// ))
PHPでオブジェクトのデータへのアクセス
オブジェクトのデータであるプロパティやメソッドにアクセスする際は「->」を使用します。
// [ PHPでオブジェクトのデータへのアクセス ]
// 1. Objectの元となる class を作成する
class Robotama{
public $name = "ロボ玉";
public $like = "ひまたね";
public $from = "グンマー帝国";
public $cost = null;
}
// 2. オブジェクト(クラス)は new でインスタンス化(実体化)
$robotama = new Robotama;
// 3. オブジェクト(インスタンス)の Data(value) は「 -> 」で key名を指定して、呼び出す。
echo $robotama->like . "\n";
// [ 実行結果 ]
// ひまたね
PHPでオブジェクトのプロパティ(key)の存在確認
PHPでは、property_exists()
でプロパティ(key)の存在確認ができます。
PHP-Manualから詳細は、引用します。
property_exists
property_exists — オブジェクトもしくはクラスにプロパティが存在するかどうかを調べる
[ 説明 ]
property_exists(object|string $object_or_class, string $property): bool
この関数は、与えられたプロパティ
property
が 指定されたクラスに存在するかどうかを確認します。[ パラメーター ]
- object_or_class: 確認するクラス名、もしくはクラスのオブジェクトを指定します。
- property: プロパティ名を指定します。
[ 戻り値 ]
プロパティが存在している場合は
true
、存在していない場合にfalse
、エラー時には
引用元: PHP-Manual: property_existsnull
を返します。
次のSampleCodeでは、property_exists()
でプロパティの存在確認をしています。
// [ PHP オブジェクト プロパティの存在確認 ]
// 1. Objectの元となる class を作成する
class Robotama{
public $name = "ロボ玉";
public $like = "ひまたね";
public $from = "グンマー帝国";
public $cost = null;
}
// 2. オブジェクト(クラス)は new でインスタンス化(実体化)
$robotama = new Robotama;
echo 'property_exists() で property の存在チェック!' . "\n";
// 3. property_exists() で property の存在チェック!
echo property_exists($robotama, 'from');
echo "\n";
// [ 実行結果 ]
// 1
echo property_exists($robotama, 'robotama_flag');
echo "\n";
// [ 実行結果 ]
// (falseなので何も表示されない!)
オブジェクトのプロパティ(key)にデータがSetされているかの確認 (Nullチェック)
isset()
やis_null()
を使用することで、オブジェクトのプロパティ(key)にデータがSetされているかの確認 (Nullチェック)をすることができます。
// [ オブジェクトのプロパティ(key)にデータがSetされているかの確認 (Nullチェック) ]
// 1. Objectの元となる class を作成する
class Robotama{
public $name = "ロボ玉";
public $like = "ひまたね";
public $from = "グンマー帝国";
// 2. $costの値は、null でデータが空の状態(Setされていない)
public $cost = null;
}
// 3. オブジェクト(クラス)は new でインスタンス化(実体化)
$robotama = new Robotama;
// 4. Objectの指定したKeyにデータがSetされているかどうか確認する関数
function NullChecker ($object ,$key) {
if (isset($object->$key)) {
echo "{$key} は、{$object->$key}" . "\n";
} else {
echo "{$key} には、データがSetされていません!" . "\n";
}
}
NullChecker($robotama, 'cost');
// [ 実行結果 ]
// cost には、データがSetされていません!
NullChecker($robotama, 'name');
// [ 実行結果 ]
// name は、ロボ玉
// 5. is_null() でも null-Check はできます!
if (is_null($robotama->cost)) {
echo '値はNullです' . "\n";
} else {
echo 'Null以外の値です' . "\n";
}
// [ 実行結果 ]
// 値はNullです
オブジェクト(Object)であるかどうか調べるには?
ある値がオブジェクトかどうか調べるには is_object()
を使用します。
オブジェクト型であれば 論理値 true を返し、そうでなければ false を返します。
// [ オブジェクト(Object)であるかどうか調べるには? ]
$stdObject = new stdClass();
if(is_object($stdObject) === TRUE) echo "オブジェクト型です。\n";
// オブジェクト型です。
$object = new DateTime();
echo is_object($object) ? "オブジェクト型です。\n" : "オブジェクト型ではありません。\n";
// オブジェクト型です。
$object = array();
echo is_object($object) ? "オブジェクト型です。\n" : "オブジェクト型ではありません。\n";
// オブジェクト型ではありません。
PHPの stdClassとは?
stdClass は、プロパティやメソッドをいっさい持たない標準クラスです。
stdClassの stdとは「Standard」(標準)の略で、普通のクラスのように new を用いてインスタンスを作成して使用できます。
また、配列などの他の型からオブジェクト型にCast(型変換)を行うとstdClassのインスタンスになります。
// 1. 空のstdClassインスタンス(Object)を作成して、var_dump()で出力する!
var_dump(new stdClass());
// [ 実行結果 ]
// object(stdClass)#1 (0) {}
stdClass の特徴などを理解する上で、有用なのが次のPHP-ManualのNoteです。
Notes on stdClass (翻訳: stdClass に関する注意事項)
stdClass is the default PHP object.
(翻訳: stdClass はデフォルトの PHP オブジェクトです。)
stdClass has no properties, methods or parent.
(翻訳: stdClass には、プロパティ、メソッド、または親がありません。)
It does not support magic methods, and implements no interfaces.
(翻訳: 魔法のメソッドをサポートしておらず、インターフェイスを実装していません。)
When you cast a scalar or array as Object, you get an instance of stdClass.
(翻訳: スカラーまたは配列を Object としてキャストすると、stdClass のインスタンスが取得されます。)
You can use stdClass whenever you need a generic object instance.
(翻訳: 汎用オブジェクト インスタンスが必要な場合はいつでも stdClass を使用できます。)
stdClass is NOT a base class!
(翻訳: stdClass は基底クラスではありません!)
PHP classes do not automatically inherit from any class.
(翻訳: PHP クラスは、どのクラスからも自動的に継承されません。)
All classes are standalone, unless they explicitly extend another class.
(翻訳: 別のクラスを明示的に拡張しない限り、すべてのクラスはスタンドアロンです。)
PHP differs from many object-oriented languages in this respect.
(翻訳: この点で、PHP は多くのオブジェクト指向言語とは異なります。)
You cannot define a class named ‘stdClass’ in your code.
(翻訳: コードで「stdClass」という名前のクラスを定義することはできません。)
That name is already used by the system.
(翻訳: その名前はシステムによって既に使用されています。)
You can define a class named ‘Object’.
(翻訳: 「Object」という名前のクラスを定義できます。)
You could define a class that extends stdClass, but you would get no benefit, as stdClass does nothing.
(翻訳: stdClass を拡張するクラスを定義することもできますが、stdClass は何もしないため、メリットはありません。)
引用元: PHP-Manual: クラスの基礎
上記の引用から stdClassの特徴・要点をまとめると、次のようになります。
- stdClass はデフォルトの PHP オブジェクト・PHPクラス
- 親クラスなどは無い
- プロパティやメソッドが無い
- マジックメソッドが無い
- インターフェイスが無い
- スカラーまたは配列を Object としてキャストすると、stdClass のインスタンス(オブジェクト)になる
- stdClassという名前のクラスを定義することはできない。
それでは、実際に、stdClassのオブジェクトを作る方法を見ていきます。
stdClassのオブジェクトを作る方法-1: new stdClass() で作成する
stdClassは、普通のクラスなので new を用いてインスタンスを作成して使用できます。
// [ stdClass を呼び出す ]
// 1. stdClassのオブジェクトを作成する
$stdObject = new stdClass();
// 2. stdClassのオブジェクトに「key & value」を追加する
$stdObject->val1 = 123;
$stdObject->val2 = 'ロボ玉試作1号機🔥';
// 3. stdClassのオブジェクトにアクセスする
echo $stdObject->val1 . "\n";
echo $stdObject->val2 . "\n";
// [ 実行結果 ]
// 123
// ロボ玉試作1号機🔥
stdClassのオブジェクトを作る方法-2: 配列をオブジェクトにキャスト(型変換)する
オブジェクト以外の型がオブジェクト型に変換(Cast)される場合、
stdClass というPHPで予め定義されているビルトインクラスのインスタンスが新規で生成されます。
ちなみに、配列がオブジェクトに変換される場合は、配列の Key とValue がそれぞれ オブジェクトのプロパティ名(Key)と Value になります。
なので、例えば配列や連想配列をオブジェクトでキャスト(型変換)すると、次のようになります。
// 1. 配列をオブジェクトにCast(型変換)する
$robotama_array = (object)['ロボ玉', 'Robo-Ball', 'ぷるぷるロボ玉'];
var_dump($robotama_array);
echo "\n";
// [ 実行結果 ]
// object(stdClass)#1 (3) {
// ["0"]=>
// string(9) "ロボ玉"
// ["1"]=>
// string(9) "Robo-Ball"
// ["2"]=>
// string(21) "ぷるぷるロボ玉"
// }
// 2. 連想配列をオブジェクトにCast(型変換)する
$robotama_associative_array = (object)[
'robotama' => 'ロボ玉',
'tama' => 'Robo-Ball',
'purupuru' => 'ぷるぷるロボ玉'
];
var_dump($robotama_associative_array);
echo "\n";
// [ 実行結果 ]
// object(stdClass)#2 (3) {
// ["robotama"]=>
// string(9) "ロボ玉"
// ["tama"]=>
// string(9) "Robo-Ball"
// ["purupuru"]=>
// string(21) "ぷるぷるロボ玉"
// }
配列からオブジェクトへの変換(Cast)
配列からオブジェクトへの変換(Cast)するには(object)
で変換(Cast)します。
配列を作成してから、オブジェクトへ変換(Cast)する
// 1. 配列を作成してから、オブジェクトへ変換(Cast)する
$robotama2 = (object) [
'name' => 'ロボ玉試作2号機🔥',
'from' => 'さいたまー共和国',
'power' => 2000,
'weapon' => 'ロボ玉-バズーカー',
'robotama_flag'=> true
];
// 2. Objectにアクセスする
echo 'name: ' . $robotama2->name . "\n";
echo 'from: ' . $robotama2->from . "\n";
// [ 実行結果 ]
// name: ロボ玉試作2号機🔥
// from: さいたまー共和国
// 3. Objectの中身を表示 => 構造を確認
var_export($robotama2);
// [ 実行結果 ]
// (object) array(
// 'name' => 'ロボ玉試作2号機🔥',
// 'from' => 'さいたまー共和国',
// 'power' => 2000,
// 'weapon' => 'ロボ玉-バズーカー',
// 'robotama_flag' => true,
// )
オブジェクトを値に持つ配列(Object-Array)を作成する
// 1. オブジェクトを値に持つ配列(Object-Array)を作成する
$userList = [
(object) ['id'=> 1, 'name'=> 'ロボ玉'],
(object) ['id'=> 2, 'name'=> 'ロボ・ボール'],
(object) ['id'=> 3, 'name'=> 'ロボ玉試作1号機🔥'],
(object) ['id'=> 4, 'name'=> '白桃'],
(object) ['id'=> 5, 'name'=> 'ももちゃん'],
(object) ['id'=> 6, 'name'=> 'ロボ玉試作2号機🔥'],
];
// 2. foreachで、オブジェクト配列から1つずつオブジェクトを取り出す
foreach ($userList as $user) {
echo $user->id . '. '; // ID
echo $user->name; // 名前
echo "\n";
}
// [ 実行結果 ]
// 1. ロボ玉
// 2. ロボ・ボール
// 3. ロボ玉試作1号機🔥
// 4. 白桃
// 5. ももちゃん
// 6. ロボ玉試作2号機🔥
// 3. Objectの中身を表示 => 構造を確認
var_export($userList);
echo "\n";
// [ 実行結果 ]
// array (
// 0 =>
// (object) array(
// 'id' => 1,
// 'name' => 'ロボ玉',
// ),
// 1 =>
// (object) array(
// 'id' => 2,
// 'name' => 'ロボ・ボール',
// ),
// 2 =>
// (object) array(
// 'id' => 3,
// 'name' => 'ロボ玉試作1号機🔥',
// ),
// 3 =>
// (object) array(
// 'id' => 4,
// 'name' => '白桃',
// ),
// 4 =>
// (object) array(
// 'id' => 5,
// 'name' => 'ももちゃん',
// ),
// 5 =>
// (object) array(
// 'id' => 6,
// 'name' => 'ロボ玉試作2号機🔥',
// ),
// )
Twitterやってます!Follow Me!
神聖グンマー帝国の逆襲🔥
神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!
プログラミング学習・エンジニア転職関連の情報
自宅で現役エンジニアから学べる『TechAcademy』 (エンジニア転職保証)
『GEEK JOBキャンプ』スピード転職コース(無料)
【IT道場】入校時0円! 就職目的プログラミングスクール
エンジニア転職なら100%「自社開発」求人に強い【クラウドリンク】
『techgym』 (Python特化・無料)
PHP / Laravel書籍
参考・引用
- PHP の オブジェクト型(object) について
- PHP-Manual: property_exists
- PHP でオブジェクトの配列を作成する
- 【PHP】オブジェクト形式のデータを作成する方法
- PHP-Manual: クラスの基礎
- 【PHP】stdClassについて
- 連想Keyを使ったArrayの代わりにstdClassを利用する
- stdClassのオブジェクトを作る方法