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

我看到了两种方法来做到这一点。第一个更像是工厂模式,第二个使用重载。

工厂:

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用来进行实例化。

第二种方法将实例化保持在内部,但使用 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 回答