7
6

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で関数のオートロードの代わり

Posted at

ちょっとしたメソッドで$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名前空間には関数が漏れないので、害になることはない…はず?

7
6
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
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?