PHP5.4からtraitが利用できるようになる事をご存知の方も多いと思います。
traitはコードの水平再利用を可能にする仕様拡張です。Rubyのmixinのような機能と言えば分り易いかも知れません。
誰でもtraitを利用したくなるようなコードをinternals@php.netのMLで見かけたので紹介しよう、と思って書いたのですがコピペしたコードをしっかり読んでなくておかしな所があった事を @sotarok さんに教えてもらいました。
元のコードは色々問題があるので書き直しました。こうやればアクセサーを沢山書く必要が無くなります。
https://gist.github.com/1379592 (読みやすいコードはこちらをどうぞ)
<?php
trait Accessors{
public function __get($name){
if ($this->r_property[$name])
return $this->$name;
else
trigger_error("Access to read protected property");
}
public function __set($name, $value){
if ($this->w_property[$name])
$this->$name = $value;
else
trigger_error("Access to write protected property");
}
}
class OrderLine{
use Accessors;
private $r_property = array('price'=>1, 'amount'=>1);
private $w_property = array('price'=>1, 'amount'=>1);
protected $price;
private $amount;
public function getTotal(){
return $this->price * $this->amount;
}
}
$line = new OrderLine;
$line->price = 20;
$line->amount = 3;
echo "Total cost: ".$line->getTotal();
?>
これをPHP 5.4で実行すると
Total cost: 60
と表示されます。
niigataの強敵現れる?!という事ではなく、個人的な好みとしてはread only属性が在ったほう便利だと思います。
注)niigataとは読めるけど書けないプロパティを作る、という昨年のPHPカンファレンスで発表されたPHPの拡張パッチです。多くの日本人は新潟を読めるけど、正しく書けない、という現実にちなんでつけられた名前だそうです。
さすがにniigataじゃ受け入れてもらえないだろうから普通の名前を考えるとしたら何が良いかな?