3

各パブリック メソッドの前に実行されるメソッドが必要です。

public メソッドの __call のようなメソッドはありますか?

セッター メソッドの前にすべての引数を削除したいと考えています。

4

1 に答える 1

1

__callいいえ、パブリック メソッドのようなメカニズムはありません。しかし__call()、すでにあなたが探しているものです。

以下を使用して「疑似パブリック」インターフェースを定義します__call

class A {

    protected $value;

    /**
     * Enables caller to call a defined set of protected setters.
     * In this case just "setValue".
     */
    public function __call($name, $args) {
        // Simplified code, for brevity 
        if($name === "setValue") {
            $propertyName = str_replace("set", "", $name);
        }

        // The desired method that should be called before the setter
        $value = $this->doSomethingWith($propertyName, $args[0]);

        // Call *real* setter, which is protected
        $this->{"set$propertyName"}($value);
    }

    /**
     * *Real*, protected setter
     */
    protected function setValue($val) {
        // What about validate($val); ? ;)
        $this->value = $val;
    }

    /**
     * The method that should be called
     */
    protected function doSomethingWith($name, $value) {
         echo "Attempting to set " . lcfirst($name) . " to $value";
         return trim($value);
    }
}

例を試すと:

$a = new A();
$a->setValue("foo");

... 次の出力が得られます。

Attempting to set value to foo
于 2014-07-02T14:14:39.587 に答える