0

別のクラスのクラスのクラスメソッドを作成する方法はありますか?

例:

class A
{
    public function makeMethod()
    {
        $this->b = new B();
        //create a method for class B such as a __call() method
        //to catch an error trying to access a non existant class B method
        if (!method_exists($this->b, "__call")
            // create __call() method
    }
}

class B
{

}
4

5 に答える 5

2

クラスのメソッドをその場で実際に作成できるかどうかは完全にはわかりません。そして、可能であれば、それは非常に悪いOOPプラクティスになると思います。

クラスは基本的にオブジェクトの青写真です。クラス内のメソッドをコーディングできない理由がわかりません。

存在しない可能性のあるコントローラー(つまり、edit /)でエラーを停止するには、自分のMVCフレームワークに次のコマンドを使用して、クラスにメソッドが存在するかどうかを確認します。

$controller = new $class();

if( method_exists( $controller, $this->uri['method'] ) )
    $controller->{$this->uri['method']}( $this->uri['var'] );
else
    $controller->index();   
于 2012-04-18T07:56:18.330 に答える
1

試す

class A {

    public function makeMethod() {
        $this->b = new B ();
        // create a method for class B such as a __call() method
        // to catch an error trying to access a non existant class B method
    }

    public function __call($method, $args) {
        if (isset ( $this->$method )) {
            $func = $this->$method;
            $func ();
        }
    }
}

$foo = new A ();
$foo->baba = function () {
    echo "Hello Baba";
};

$foo->baba ();
于 2012-04-18T07:56:27.257 に答える
1

runkit拡張機能がインストールされている場合は、そこにrunkit_method_add機能があります。ただし、これがインストールされることはめったにないため、任意に使用しないでください。

于 2012-04-18T07:57:26.783 に答える
1

この例を見てください:

class A
{
    public function makeMethod()
    {
        $this->b = new B();
        //create a method for class B such as a __call() method
        //to catch an error trying to access a non existant class B method

        $this->b->doit();
    }
}

class B
{

    public function __call($name,$args)
    {
        echo "function called: $name with arguments: $args";
    }

}

$a = new A();

$a->makeMethod();

?>

これは出力します:

function called: doit with arguments: Array

したがって、ある意味で、の存在しない関数を呼び出しましたが、class Bそれでも何かを行うことができます。たとえば、の__callメソッドでclass B、実行を何らかのコールバック関数(のclass A)に向けることができませんでしたか?なぜそれを「作成」するのですか?(絶対に必要な場合を除いて、開発者の観点から考えないでください... :-))

ただのアイデア...


Minima Frameworkでのページ/モジュール実行処理の概要 :

public function  __call($name, $arguments=NULL)
{
    $function_name = "_".$name;

    $trace = debug_backtrace();

    $moduleCall = false;

    if (isset($trace[2]))
    {

        if (isset($trace[2]['object']))
        {
        $trace = $trace[2]['object'];

        if (is_subclass_of($trace, 'mmModule'))
            $moduleCall = true;
        }
    }

    $args = $this->matchArguments($name, $arguments);

    if ($moduleCall) { $this->redirect ($name, $arguments); }
    else
    {
        $this->Result = call_user_func_array(array($this, $function_name), $args);

        $this->loadTemplate($name);
    }
}

PS私はすでに100%PHPフレームワークを自分で作成しているという理由だけで、おそらくあなたが何を必要としているかを知っています...

于 2012-04-18T07:54:52.427 に答える
1

スーパークラスでメソッドabstractを宣言できます。これは、サブクラスが抽象メソッドを実装することが期待されているが、実際の実装は提供されないことを意味します。

メソッドabstractを宣言する場合、クラスもabstractである必要があります。

于 2012-04-18T07:55:20.553 に答える