PHP-从实例化对象的类中调用方法

时间:2019-02-25 10:48:40

标签: php oop

我有两个声明的类,如下例所示。

class A{
   protected $process;

   public function __construct() {
      ......
      $this->process=new B();

   }

   public function do_something(){
     ....
   }

}

class B{
 // content not important
 // I need to call do_something from class A     

}

我的问题是,如何从类B调用类A的方法do_something()?可能吗?

3 个答案:

答案 0 :(得分:1)

根据您的示例,B的实例不可能知道它是由类A的实例实例化和存储的。您需要以某种方式显式创建该连接。

我认为这甚至行不通,但是显然您可以在A的构造函数完成之前将B的实例传递给A

class A {
    protected $process;

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

    }

    public function do_something() {
        var_dump( 'do_something' );
    }

    public function test() {
        $this->process->test();
    }
}

class B {

    public function __construct( A $a ) {
        $this->a = $a;
    }

    public function test() {
        $this->a->do_something();
    }
}

$a = new A();

$a->test(); // do_something

答案 1 :(得分:0)

由于我们不知道AB的作用,因此很难就适合您的特定情况的最佳方法提供建议。

有几种方法可以实现这一目标。一种方法是使B和A扩展,从而使类A的所有方法可在对象B上调用。另一种方法是在B内创建A的新对象并调用该方法。或者您可以通过

下面是一个示例,其中B从A扩展。通过这样做,可以在A上调用B的所有属性和方法,除非在B中覆盖。

class A {
    public function doSomething(){
        echo "doSomething() called in A";
    }

}
class B extends A {
    public function someMethod() {
        $this->doSomething();
    }
}

$b = new B();
$b->someMethod();

以上内容将输出doSomething() called in A

或者,您可以创建对象A并在B内调用该方法。

class B {
    public function someMethod() {
        $a = new A();
        $a->do_something();
    }
}
$b = new B();
$b->someMethod();

答案 2 :(得分:0)

在阅读所有答案并进行了一些研究之后,我认为对我来说最好的方法是使用特质

“特质是一种在PHP等单一继承语言中重用代码的机制。特质旨在通过使开发人员在生活在不同类层次结构中的多个独立类中自由地重用方法集,从而减少某些单一继承的限制。 “

所以我用do_something方法声明了Trait并从A类和B类中调用该方法

谢谢