Ficus_Bean
FicusではFicus_Beanという抽象クラスを良く使います.
Java Beansほどwitにとんだネーミングではなく,単にマネです.パクリです.
Razzyに何でもやろうとしてちょっと肥大化しちゃったBeanクラス.
Contents of /trunk/src/php/ficus/beans/Bean.php - ficus - SourceForge.JP
PHPには,__callというものすごく便利な関数があって,
<?php class A{ public function __call($name, $arguments){ echo $name . "\n"; } } $a = new A(); $a->hello(); $a->bye(); ?>
を実行すると,
hello bye
と表示される.
で,Ficus_Beanの定義を見ると,
<?php const METHOD_SIGNATURE = '/^(set|get|addAll|appendAll|pushAll|add| append|delete|shift|push|pop|insert| numOf|count|clear|has|isEmpty|isNot| is|enable|disable)([a-zA-Z][a-zA-Z0-9_]*)/'; const METHOD_SIGNATURE_SUFFIX = '/^([a-zA-Z][a-zA-Z0-9_]*?)(EqualsTo)/'; ?>
という定義がしてあって・・・
要するに,
<?php class Test extends Ficus_Bean{ protected $data; } ?>
とBeanが定義されていれば,
- setData
- data(getDataと同義)
- getData
- addAllData(Array)
- pushAllData(Array)
- addData
- appendData
- deleteData
- shiftData
- pushData
- popData
- insertData
- numOfData
- countData
- clearData
- hasData
- isEmptyData
- isNotData
- isData
- enableData
- disableData
- dataEqualsTo
というメソッドが,最初から使えるようになっています.それぞれのメソッドは,なんとなく意図したとおりに動くはず.
また,
- Array
- JSON
- RDF
- String
- SOAPValue
へのserializer/deserializerを備えています.
<?php $json = $bean->serialize("JSON"); $json = $bean->serialize(new Ficus_JSONBeanSerializer()); $bean->deserialize($json, "JSON"); $bean->deserialize($json, new Ficus_JSONBeanDeserializer()); ?>
とかで目的の形式に変換できます.
あとは,
<?php $bean->beanProperties(); $bean->annotationAccessor(); $bean->propertyAnnotationAccessor(); ?>
とかでプロパティを列挙したり,アノテーションを取得したりできます.
pagesでは,Ficus_PageがFicus_Beanをextendsしているので,getter/setterはもちろんのことプロパティに対するたいていの操作は定義なしで利用することができます.
確かにちょっとやりすぎ感はあるけれど,これのおかげで楽しています.
ただし,S2Container.php5と相性が悪いのでDIできない・・・という問題も無きにしも非ず.
まぁpropertyディレクティブが使えないだけで,initMethod使えばいいのですが.
あと,__callのメソッドはAOPできない・・・だけ!.
getter/setterを定義する行為って本当に何の意味もないと思う.最近Teedaを使ってプログラムを書いているけれど,いくらEclipseにGeneratorがついていても,
<?php class Hoge extends Ficus_Bean{ protected $data; } ?>
と
public class Hoge{ private String data; public Hoge(){ } /** * @param data String the data */ public void setData(String data){ this.data = data; } /** * returns the data. * @return String data */ public String getData(){ return this.data; } }
のどちらが,いいかは一目瞭然だと思う.
なぜPOJOはgetter/setterを定義しなくてはいけないのかな.
まぁ型のあるなしなのかもしれないけど.
必要ならば,定義するということでいいと思うんだけどなぁ.
てなわけで,Ficus_Beanでした.