2016年11月16日水曜日

【PHP】 「今日は今年の何日目?」と、property の readonly 属性

1) 「今日は今年の何日目?」を返す機能が見つからなかったので、作ってみた。
2) PHP の property には readonly 属性がないので、作ってみた。

class myDateTime extends DateTime {

  function __get($name) {
    //プロパティの取得
    switch ($name) {
      case 'days':
        return $this->getDays();
        break;
      default:
        throw new Exception('undefined propery : '.$name);
        break;
    };
  }

  function __set($name, $value) {
    // readonly の実装
    switch ($name) {
      case 'days':
        //これがないと __get で定義された property も値を変更できる
        throw new Exception('readonly propery : '.$name);
        break;
      default:
        //このクラスで定義されていない property はエラーとする
        throw new Exception('undefined propery : '.$name);
        break;
    };
  }

  private function getDays() {
    //基準日の元旦を 0 として、何日目かを返す
    $base = new DateTime($this->format('Y').'-1-1');
    return $this->diff($base)->days;
  }
}
?>

※※※ 使い方 ※※※

  $date = new myDateTime();
  echo '今日は今年の '.($date->days + 1).' 日目です。';
  $date = new myDateTime("2016-12-31");
  echo '2016 年は '.($date->days + 1).' 日あります。';
?>