A类加载并保持B类,想从B类调用方法

时间:2011-11-30 01:07:03

标签: php oop

尽管有很多类似主题的问题,但还是找不到我想要的东西......

示例:

class A {
    public $_Thing_B; // class B object
}

class B {
    public function printSelf() {}
}

构建时,Class A会将相应版本的Class B拉入其中,此对象用于Class A中的各种私有方法。

但是Class B确实有一些公共方法,只有在代码中“处理”Class A时才会有用(因此不能直接使用Class B的独立实例)。

因此,偶尔我想这样做:

$objA = new A;
$result = $objA->$_Thing_B->printSelf();

在我看来,维护此功能的唯一方法是将Class B声明为Class A内的公共变量。

这是对的吗?或者有没有办法让它保持私密,同时仍然暴露某些公共方法?

4 个答案:

答案 0 :(得分:0)

如果您确实需要在$_Thing_B中保持A私有,则可以将公共方法中需要公开的B方法包装起来。我认为这很奇怪,并且会亲自将$_Thing_B作为公共财产,并直接以A->B->method()

的形式访问其方法
class A {
    private $_Thing_B; // class B object is private

    // Wrap private _Thing_B's methods in public methods: 
    public function print_B() {
      $this->_Thing_B->printSelf();
    }
}

$objA = new A();
$result = $objA->print_B();

答案 1 :(得分:0)

对于您需要使用ClassB的特殊方法,您只需创建该方法

即可

所以而不是

$objA->$_Thing_B->printSelf();
你打电话

$objA->printSelf(); 

和A类看起来像:

class A {
    private $_Thing_B; // class B object

   public function printSelf(){
      $this->_Thing_B->printSelf();
   } 
}

不要忘记实例化B级,例如在构造函数内但在使用它之前!

答案 2 :(得分:0)

您可以通过将一些B类方法重新实现到A类中,为B类对象$_Thing_B创建Adapter

例如,对于printSelf()方法,我们可以使用:

class A {
    private $_Thing_B;

    public function printSelf() {
        return $this->_Thing_B->printSelf();
    }
}

$objA = new A();
$result = $objA->printSelf();

答案 3 :(得分:0)

这对我来说很好。

$a = new A();
$a->_Thing_B->printSelf();

class A {
    public $_Thing_B; // class B object

    public function __construct() 
    {
        $this->_Thing_B = new B();
    }
}

class B {
    public function printSelf() 
    {
        print_r("This is Class B::printSelf()");
    }
}

但你也可以这样做,这可能是更好的方法: -

$a = new A();
$a->getThingB()->printSelf();

class A {
    private $_Thing_B; // class B object

    public function __construct() 
    {
        $this->_Thing_B = new B();
    }

    public function getThingB()
    {
        return $this->_Thing_B;
    }
}

class B {
    public function printSelf() 
    {
        print_r("This is Class B::printSelf()");
    }
}

两个选项都提供输出"This is Class B::printSelf()"

因此,private方法$_Thing_B公开了public变量getThingB()