stdClassの名前が出てこずストラクトクラスとかでググって出てこなくて泣いたので忘れないうちにメモ
#stdClassとは
- PHPデフォルトのクラス
- 親クラスなどは無い
- プロパティが無い
- メソッドが無い
- マジックメソッドが無い
- インターフェイスが無い
PHPマニュアルのノート部分に英語でそれとなく書かれてます。
http://php.net/manual/ja/language.oop5.basic.php
###普通のクラスと何が違う?
上記に挙げた特性を見ると、ほとんど空っぽのクラスみたいなstdClassですが、一旦インスタンスを生成すると存在しないプロパティに自由にアクセスできるようになります。
#どう使う
上に説明した特性を使いとりあえず何でも連想配列に格納するみたいな悪習(※1)を少しだけ減らすのに使用します。
##ArrayをstdClassで代替
$member = array();
$member['name'] = 'Qii太';
echo $member['name'];
$member = new stdClass():
$member->name = 'Qii太';
echo $member->name;
これだけです。
特にプロパティを定義する必要はありません。
ただし存在しない(一度も代入してない)プロパティにアクセスするとNoticeエラーが発生します。
php > $a = new stdClass();
php > echo $a->test;
PHP Notice: Undefined property: stdClass::$test in php shell code on line 1
#####(※1)主観に基づきます。
実務的なメリットを挙げるとすると揺るぎないアクセス子として使えます。
例えば連想配列を使うと["name"]
と['name']
は等しくアクセス可能ですが、一括置換するときには2度手間、文章検索するときも2度手間or長大な検索ワードを構築する必要があったり大変面倒です。
##理想
MVCモデルを達成するため(MVCモデルにかぎらず)に各要素間でやりとりするEntityクラスを作るのが理想である。
例えばゲッター セッターを実装したEntityクラスとか
class Member{
private $_name;
public function getName(){
return $this->_name;
}
public function setName($name){
$this->_name = $name;
}
}
こんなclassを用意し
<?php
//戻りはMemberClass
$member = findMember();
?>
<?= $member->getName(); ?>
こんなふうに使いたい
##現実
しかし時間に追われている時は手が回らないことが多くDBの問い合わせ結果などEntityクラスを作る暇も惜しい(ゲッター セッター ジェネレータがあったとしても)なんて珍しくない。
すると
<?php
//戻りはArray
$member = findMember();
?>
<?= $members['name'] ?>
するとこんなコードになる。
##stdClassにする
ちょっとだけ見栄えが良くなる(と思う)
<?php
//戻りはstdClass
$member = findMember();
?>
<?= $members->name ?>
以上