福冨諭の福冨論

RSSリーダーではこちらをどうぞ→https://feeds.feedburner.com/fuktommy

Smartyテンプレート+オブジェクト(バッドノウハウ編)

Smartyテンプレート内でオブジェクトが使える件」の書き方なんだけど(luckyColorをtypoしてた件とは別に)、

{$fortune->luckyColor()|escape}

この書き方だと、$fortuneをassignし忘れると fatal error になるのな。 ところが

{$fortune->luckyColor|escape}

だとエラーにはならない不思議。 そこでFortuneクラスをこんな風に。

class Fortune
 {
     public function __get($key)
     {
         try {
             $method = 'get' . ucfirst($key);
             if (method_exists($this, $method)) {
                 return $this->$method();
             } else {
                 return $this->$key;
             }
         } catch (Exception $err) {
             return null;
         }
     }
 
     public function getLuckyColor()
     {
         // なんか複雑な処理
     }
 }

これだと多少のことならなんとかなりそう。 一番いいのは fatal error を catch できることなんだけど、 副作用的にいいことがあって、 配列だとPHPの文法だと $hoge['fuga'] みたくなるのが、 Smartyだと {$hoge.fuga} ってなるわけだけど、 オブジェクトならどちらも $hoge->fuga だからハッピーで、 さらにGetterを使えば、取得のときにただ値を参照するだけなのか、 処理をしているのかを隠蔽できていいかもしんない。

Original Article: http://blog.fuktommy.com/1223642982