ちょっとしたメソッドで$thisとかselfとか書くのがしんどいとき。
http://qiita.com/k-motoyan/items/7bbaadc45e20ad7d4b4c
関数のオートロードしたい。
以下のようにするとそこそこ使えるのではないかと試している。
<?php
// My/App/FizzBuzz.php
namespace My\App;
class FizzBuzz {
/*
* 外部に公開する関数
*/
public static function get(array $data) {
return fmap(FizzBuzz\fizzbuzz(), $data);
}
public static function show(array $data) {
return FizzBuzz\show($data);
}
}
namespace My\App\FizzBuzz;
/*
* 内部用の関数群
*/
// (integer d, Functor s, MonadPlus s) => d -> a -> d -> s a
function calc(...$args){
return f(function($d, $s, $n){
return fconst($s, guard($n % $d === 0));
}, ...$args);
}
function fizzbuzz(){
return fromMaybe()->ap(mappend(calc(3, "Fizz"), calc(5, "Buzz")));
}
function pr(...$args){
return f(function($a){
echo $a, "\n";
return $a;
}, ...$args);
}
function show(array $data){
return fmap(pr()->compose(fizzbuzz()), $data);
}
一ファイルにこれを書く。
使い方。
<?php
use My\App\FizzBuzz;
require 'vendor/autoload.php';
FizzBuzz::show(range(1, 100));
// $data = FizzBuzz::get(range(1, 100));
// var_dump($data);
FizzBuzzクラスをFizzBuzz名前空間の外部公開用エイリアスとして使う。クラス名に名前空間名をかぶせる。
My\App名前空間には関数が漏れないので、害になることはない…はず?