7

オブジェクトから特定のメソッドが呼び出されたときに、その魔法のメソッドが最初に呼び出されるという魔法のメソッドはありますか。__call メソッドに似ていますが、これはメソッドが見つからない場合にのみトリガーされます。

だから私の場合、私はこのようなものが欲しいです:

class MyClass
{
    public function __startMethod ( $method, $args )
    {
        // a method just got called, so  this is called first
        echo ' [start] ';
    }

    public function helloWorld ( )
    {
        echo ' [Hello] ';
    }
}

$obj = new MyClass();
$obj->helloWorld();

//Output:
[start] [Hello] 

このようなものはPHPに存在しますか??

4

3 に答える 3

6

これを直接行う方法はありませんが、アスペクト指向プログラミングの形式を実装しようとしているように見えます。PHPでこれを実現するには、いくつかの方法があります。1つは、次のようにクラスを設定することです。

class MyClass
{
    public function __startMethod ( $method, $args )
    {
        // a method just got called, so  this is called first
        echo ' [start] ';
    }

    public function _helloWorld ( )
    {
        echo ' [Hello] ';
    }

    public function __call($method, $args)
    {
        _startMethod($method, $args);
        $actualMethod = '_'.$method;
        call_user_func_array(array($this, $actualMethod), $args);
    }
}

$obj = new MyClass();
$obj->helloWorld();

PHPでAOPを実装する他の方法を調べて、自分に最適な方法を確認してください(どこかにリンクが見つかるかどうかを確認します)。

編集:ここにあなたのための文書がありますhttp://www.liacs.nl/assets/Bachelorscripties/07-MFAPouw.pdf

于 2012-04-06T18:35:34.160 に答える
2

いいえ、これには魔法の方法はありません。

あなたができる最善の方法は、関数に別の名前を作成することです (例: )。次に、すべての呼び出しをhidden_helloWorldキャッチし、メソッドが使用可能な場合は呼び出しを試みます。もちろん、これは、クラスとその親などの命名を完全に制御できる場合にのみ可能です...__callhidden_

于 2012-04-06T18:31:39.453 に答える
1

メソッドを非公開にし、__call() マジック メソッドを使用してメソッドを呼び出すことで、これを実現できます。お気に入り:

<?php

class MyClass{
    function __call($methd, $args){
        if(method_exists($this, $mthd)){
            $this->$mthd($args);
        }
    }

    private function mthdRequired($args){
        //do something or return something
    }

call を使用しない限り、mthdRequired メソッドは呼び出されません。これが役に立つことを願っています。

于 2015-02-07T15:19:14.527 に答える