14
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPでif

Last updated at Posted at 2014-05-19

PHPにはif文がある。しかし、おしきせのものに頼るのは癪だ。自分で実装しよう。

つまり、理想はこうだ。

echo $if($true, 'foo', 'bar');
// => 'foo'

echo $if($false, 'foo', 'bar');
// => 'bar'

函数にはパワーがある。そのパワーを駆使して、自分で利用するための$true$falseも、あなたには実装できるはずだ。

$true  = function (...) { return ...; };
$false = function (...) { return ...; };

$if = function ($cond, $then, $else) {
    return ...;
};

$if はオペランドに $cond, $then, $else をとる。

実用的には、さらに次のような函数を定義しておくと、極めてべんりだ。

$eq = function ($a, $b) use ($true, $false) {
    return ($a === $b) ? $true : $false;
};

echo $if($eq(10, 20), 'equals!', 'not equals');

さらには次のような論理演算も容易に実装することができる。

$not = function ($v) use ($true, $false) {
    return $v($false, $true);
};

$and = function ($x, $y) use ($false) {
    return $x($y, $false);
};

$or = function ($x, $y) use ($true) {
    return $x($true, $y);
};

var_dump(
    $if($and($eq(10, 10),
             $eq(10, 20)),
        'TruE',
        'FalsE'));

なに? このままでは相互運用性がないと不便だ? 仕方ない。オレオレBooleanからPHPのbool型に戻す函数も用意しようじゃないか。

$PHPBool = function ($bool) use ($if) {
    return $if($bool, true, false);
};


if ($PHPBool($eq(10, 99))) {
    var_dump("foo");
} else {
    var_dump("bar");
}

あとがき

内容は以下の記事とほとんどおんなじ。ねたは被るまいと思って書きかけのまま一週間寝かせてたら先を越されてぐぬぬ。

すこし詳しく書いておくと、これは 型無しラムダ計算 の初歩に相当する。その件については過去に書いた。どちらも短い記事なので、興味があれば参照されたい。

おいこれどうなってんだよ、といふ型がいらっしゃれば代々木.もくもくなどで詰問するべし。

14
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?