PHP类:您可以通过调用的方法访问调用实例(PHP Classes: get access to t

2019-09-17 21:05发布

遗憾对于怪异的问题,但我不知道该如何表达它以另一种方式。

我试图从一个调用的类访问方法。 就像这个例子:

class normalClass {
     public function someMethod() { 
          [...]
          //this method shall access the doSomething method from superClass
     }
}

class superClass {
     public function __construct() {
          $inst = new normalClass;
          $inst->someMethod();
     }
     public function doSomething() {
          //this method shall be be accessed by domeMethod form normalClass
    }
}

两个类都没有继承关系,我不想要的功能设置为静态。

有没有什么办法来实现这一目标?

谢谢你的帮助!

Answer 1:

你可以通过像这样的第一对象的引用:

class normalClass {
    protected $superObject;
    public function __construct(superClass $obj) {
        $this->superObject = $obj;
    }

    public function someMethod() { 
        //this method shall access the doSomething method from superClass
        $this->superObject->doSomething();  
    }
}

class superClass {
    public function __construct() {
          //provide normalClass with a reference to ourself
          $inst = new normalClass($this);
          $inst->someMethod();
    }
    public function doSomething() {
          //this method shall be be accessed by domeMethod form normalClass
    }
}


Answer 2:

你可以为这个使用debug_backtrace()。 这是一个有点玄乎,但用于调试的目的是有用的。

class normalClass {
 public function someMethod() { 
      $trace = debug_backtrace();
      $trace[1]->object->doSomething();
 }

}



Answer 3:

您有几种选择。 您可以使用聚合像这样

class normalClass
{
  protected $superClass;

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

  public function someMethod()
  {
    $this->superClass->doSomething();
  }
}

class superClass
{
  public function __construct()
  {
    $inst = new normalClass( $this );
    $inst->someMethod();
  }

  public function doSomething()
  {  //this method shall be be accessed by domeMethod form normalClass
  }
}

或者只是一个直线上升的二传手

class normalClass
{
  protected $superClass;

  public function setSuperClass( superClass $superClass )
  {
    $this->superClass = $superClass;
  }

  public function someMethod()
  {
    if ( !isset( $this->superClass ) )
    {
      throw new Exception( 'you must set a superclass' );
    }
    $this->superClass->doSomething();
  }
}

class superClass
{
  public function __construct()
  {
    $inst = new normalClass();
    $inst->setSuperClass( $this );
    $inst->someMethod();
  }

  public function doSomething()
  {  //this method shall be be accessed by domeMethod form normalClass
  }
}


Answer 4:

根据你的使用情况,您可能希望实例传递到只有功能:

class normalClass {
    public function someMethod($object) { 
        $object->doSomething();
    }
}

如果normalClass::someMethod()可以通过多个不同被称为$object S,这可能是更好的选择(而不是提供的$object到整个normalClass实例)。

但不管,你可能会考虑创建一个接口用于类型提示 :

interface ISomethingDoer {
    public function doSomething();
}

class normalClass {
    public function someMethod(ISomethingDoer $object) {
        # Now PHP will generate an error if an $object is passed
        # to this function which does not implement the above interface.
        // ...

class superClass implements ISomethingDoer {
    // ...


Answer 5:

哇我比你同样的问题,但不是用这样简单的通过去参考的对象,我与事件管理器去了,基本上,当事情将在普通类发生,它会触发这是通过听取事件一类和所述类(听众)将调用超类来执行功能,并在必要时通过它新的论据。

不管怎么说,无论你把它作为参数传递给你的对象,或者你去一个基于事件的方法,这两种解决方案的工作。 选择你喜欢的一个。

有关事件的更多信息,交向解释了它相当不错。 http://symfony.com/doc/current/components/event_dispatcher/introduction.html



文章来源: PHP Classes: get access to the calling instance from the called method
标签: php oop