walkingmask’s development log

IT系の情報などを適当に書いていきます

MENU

PHPのクラスで、メソッド呼び出しに前処理を挟む

Pythonだとデコレータとかで簡単に実装できるが、PHPだとなかなか出てこなかったので。

前処理を挟みたいメソッドをprivateにして__callを使えばいいみたいですね。

stackoverflow.com

テラテイルにも同様の回答があるのですが、コードが全く一緒で(むしろコードと出力結果が違う)日付的にstackoverflowの方が先だし、出展とか書かなくて大丈夫なのかな?質問者のコードのクラス名がFooなあたり。。。

teratail.com

一応自分でも色々いじったので、コード掲載。

class ClassWithPreprocessingMethod {
    // privateにして外部から呼び出せなくしておくのがミソ
    private function preprocesing($args = []){
        echo "前処理";
        if(count($args) < 1){
            echo "失敗..."."\n";
            return 1;
        }
        echo "成功!"."\n";
        return 0;
    }
    private function method1($args = []){
        echo "テスト1"."\n";
        var_dump($args);
        return 0;
    }
    private function method2($args = []){
        echo "テスト2"."\n";
        var_dump($args);
        return 0;
    }
    public function __call($method, $arguments) {
        if(method_exists($this, $method)) {
            // 前処理結果による処理
            if($this->preprocesing($arguments)){
                return 1;
            }
            // ここでメソッドごとの分岐など
            return call_user_func_array(array($this, $method), $arguments);
        }
    }
}

$cwpm = new ClassWithPreprocessingMethod;
$cwpm->method1();
$cwpm->method2(['preprocesing' => 'method']);

出力結果

前処理失敗...
前処理成功!
テスト2
array(1) {
  ["preprocesing"]=>
  string(6) "method"
}

いい感じですね。