Algorithm - 0と1を次々と返す簡単なお仕事 - php版

Algorithm - 0と1を次々と返す簡単なお仕事
なんとなくphpでも。
あんまりおもしろくないかな。

<?php
function flipflop() {
  static $flipflop = false;
  $flipflop = !$flipflop;
  return $flipflop;
}
function printTrueOrFalse($p) {
  $str = $p ? "True\n" : "False\n";
  echo $str;
}
echo "関数版\n";
printTrueOrFalse(flipflop());
printTrueOrFalse(flipflop());
printTrueOrFalse(flipflop());
printTrueOrFalse(flipflop());

class flipflop {
  private $p = false;
  public function next() {
    $this->p = !$this->p;
    return $this->p;
  }
}
$flfp = new flipflop();
echo "クラス版\n";
printTrueOrFalse($flfp->next());
printTrueOrFalse($flfp->next());
printTrueOrFalse($flfp->next());
printTrueOrFalse($flfp->next());
?>

でtest.phpとかで保存して実行。

$ php test3.php 
関数版
True
False
True
False
クラス版
True
False
True
False

2010/09/04追記
今朝見たら、元記事へのトラックバック0と1を次々と返す簡単なお仕事を考えてみた - なげっぱなし日誌phpで無名関数使ったやり方が出てましたね。
そっかぁ、いつの間にかphpもこんなことになってたんだなぁ。
ということで、PHP 5.3の新機能と変更点:第2回 クロージャとgoto文 |gihyo.jp … 技術評論社辺りを参考にして、自分でもやってみる。

<?php
$make_flipflop = function ($p = false) {
  return function () use (&$p) {
    $p = !$p;
    return $p;
  };
};
function printTrueOrFalse($p) {
  $str = $p ? "True\n" : "False\n";
  echo $str;
}

$flfp = $make_flipflop();
printTrueOrFalse($flfp());
printTrueOrFalse($flfp());
printTrueOrFalse($flfp());
printTrueOrFalse($flfp());
?>

実行

$ php test.php
True
False
True
False

へー。