PHP Sınıflar: denilen yöntemi çağıran örneğine erişim olsun

4 Cevap php

bu garip konu için üzgünüm ama ben başka bir şekilde ifade etmek nasıl bilmiyorum.

Ben bir arama sınıftan bir yöntem erişmeye çalışıyorum. Bu örnekte olduğu gibi:

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
    }
}

Her iki sınıf miras yoluyla ilgili değildir ve ben statik işlevi ayarlamak istemiyorum.

Bunu başarmak için herhangi bir yolu var mı?

Yardımlarınız için teşekkürler!

4 Cevap

Böyle ilk nesnesine bir başvuru iletebilirsiniz:

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
    }
}

Birkaç seçenek var. Öyle gibi toplama kullanabilirsiniz

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
  }
}

Ya da sadece bir düz-up setter

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
  }
}

Kullanımı durumda bağlı olarak, yalnızca işleve örneği geçmek isteyebilirsiniz:

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

normalClass::someMethod() birden fazla, farklı $object s tarafından çağrılabilir, bu (yerine bütün normalClass örneğine $object sağlanması) daha iyi bir seçim olabilir.

Ama ne olursa olsun bu sizin için kullanılacak bir arabirimi oluşturmayı düşünebilirsiniz type hinting:

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 {
    // ...

Bunun için debug_backtrace () kullanabilirsiniz. Bu biraz şüpheli ama hata ayıklama amacıyla için yararlıdır.

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

}