0

私はこれに似たコードを持っています:

class A
{
   public function a()
   {
       echo "I'm at 'a' function of the class 'A'<br>";
   }

    public function b()
   {
       echo "I'm at 'b' function of the class 'A'<br>";
   }
   // ... and several other functions.

   public function z()
   {
       echo "I'm at 'z' function of the class 'A'<br>";
   }

}


class B
{
   public function a()
   {
       echo "I'm at 'a' function of the class 'B'<br>";
   }

    public function b()
   {
       echo "I'm at 'b' function of the class 'B'<br>";
   }
   // ... and several other functions.

   public function z()
   {
       echo "I'm at 'z' function of the class 'B'<br>";
   }

}

class Special
{
    public function construct($param)
    {
         //This code will not work. Is there an alternative?
         $this = new $param;
    }
}

$special = new Special("A");
$special->a();

$special = new Special("B");
$special->b();

Ouput:

    I'm at 'a' function of the class 'A'
    I'm at 'b' function of the class 'B'

Special問題は、渡されたクラスからメソッドを実行できるクラス (この場合) を本当に書きたいということです。

これを実行するために考えることができる唯一の醜い方法は、A と BI にある各関数に対して、次のようなコードを書くことです。

public function h()
{
    // $param could be 'A' or 'B';
    $this->param->h();
}

しかし、「A」または「B」クラスにあるすべての関数に対してこれを行う必要があるため、これを行うのは本当に好きではありません。

私が望む主なことは、Specialクラスがコンストラクトメソッドの引数として渡された他のクラスであるかのように関数を実行できることです。

どうすればこの問題を解決できますか?

4

2 に答える 2

1

これを行うには2つの方法があります。1 つ目はファクトリ パターンに似ており、2 つ目はオーバーロードを使用しています。

工場:

class Special
{
    public static function inst($param)
    {
         //This code will not work. Is there an alternative?
        return new $param;
    }
}

$special = Special::inst("A");
$special->a();

$special = Special::inst("B");
$special->b();

http://codepad.viper-7.com/LWl1Sn

http://en.wikipedia.org/wiki/Factory_method_pattern

ファクトリ パターンでは、静的メソッドからクラスのインスタンスを返します。次に、変数が実際に持っているのは他のクラスへの参照であり、Specialそのインスタンス化を行うために使用しているだけです。

2 番目のメソッドは、インスタンス化を内部に保持しますが、php の __GET、__SET、および __CALL を使用して、そのオブジェクトの取得/設定/呼び出しを行います。

class Special
{
    private $internal;

    public function __construct($param)
    {
         $this->internal = new $param;
    }

    public function __get($key)
    {
        return $this->internal->$key;
    }

    public function __set($key,$value)
    {
        $this->internal->$key=$value;
    }

    public function __call($method,$args)
    {
        return call_user_func_array(array($this->internal,$method),$args);
    }

}

$special = new Special("A");
$special->a();

$special = new Special("B");
$special->b();

http://codepad.viper-7.com/AlaR6D

どちらも、優先される方法である可能性が最も高いファクトリで同じことを行う必要があります。

于 2013-04-03T23:22:52.170 に答える
0

私はあなたの意味を理解していると思います.オブジェクトを引数として別のクラスに渡すことができます。

このようなもの:

class A {
    public function calledByB(){}  
}
class B {

    public function callsA( A $obj ){
        $obj->calledByB();
    }
}


$b = new B();
$b->callsA( new A() );

オブジェクトの新しいインスタンスを作成し、Aそれを別のクラスのメソッドまたはコンストラクターに渡します。

于 2013-04-03T23:16:14.240 に答える