PHP 如何引用类方法定义



我想将一个函数(一个类的方法(绑定到另一个类。知道我如何实现这一目标吗?这是我想要的一个例子:

class A {
  protected $prop = "prop A";
  function method($arg1, ...) {
    return $this->prop;
  }    
}
class B {
  protected $prop = "prop B";
  // need help here
}
所以我想将类">

A"的方法"绑定"到类"B",这样就可以做$b = new B(); $b->method($arg1, ...);并获得"prop B";

提前感谢!!

我试过了:

class B {
  protected $instance;
  protected $prop = "prop B";
  public function __construct($instance) {
    $this->instance = $instance;
  }
  public function __call($method, $args) {
    return call_user_func_array([$this->instance, $method], $args);
  }
}
$b = new B(new A());
$b->method();

但仍输出"道具A";我也试过这个:

class B {
  protected $prop = "prop B";
  public function __call($method, $args) {
    return call_user_func_array(Closure::bind($this->$method, $this, get_called_class()), $arguments);
  }
}
$a = new A();
$b = new B();
$b->method = $a->method;
$b->method();

但是我收到此错误:Closure::bind() expects parameter 1 to be Closure, null given....最后我也尝试了这个:

class B {
  protected $instance;
  protected $prop = "prop B";
  public function __construct($instance) {
    $this->instance = $instance;
  }
  public function __call($method, $args) {
    $new_method = $this->instance->$method->bindTo($this);
    return call_user_func_array($new_method, $args);
  }
}
$b = new B(new A());
$b->method();

在这里,一个错误说$this->instance->$method null

使用依赖注入,您可以访问传递的对象:

class A {
  public function speak() { return ‘meow’; }
}
class B {
  public function __construct($obj) {
    $this->a = $obj;
  }
}
$demo = new B( new A));
print $demo->a->speak();
// => meow

从这里开始,如果你想让B->说话指的是A->说话:

class A {
  public function speak() { return ‘meow’; }
}
class B {
  public function __construct($obj) {
    $this->a = $obj;
  }
  public function speak() {
    return $this->a->speak();
  }
}
$demo = new B( new A));
print $demo->a->speak(); // meow
print $demo->speak(); // meow

或者,如果 B 是一种特殊的 A:

// use obj A above
class B extends A {
  // do stuff B knows
}
$demo = new B;
print $demo->speak();
// => meow

如果你想在两个类中使用完全相同的方法,也许你正在寻找的是特征。 特征或多或少是允许对象"共享"代码的对象包含。(我个人认为这是一种违反 DRY 的奇特方式,最好用 DI 来处理......但比我更聪明的人把它包含在语言中(

使用

特征将是这样的(仔细检查文档,我从未使用过这个(

trait sharedMethod {
  public function speak() {
    return $this->prop;
  }
}
class A {
  use sharedMethod;
  public $prop = “I’m from A”;
}
class B {
  use sharedMethod;
  public $prop = “I’m from B”;
  public function __construct(object $a) {
    $this->a = $a;
  }
  /**
   * use this to get A’s method, or omit to keep B’s method 
   */
  public function speak() {
    return $this->a->speak();
  }
}
$demo = new B( new A));
print $demo->speak(); // I’m from A

// if you don’t override the method
$demo = new B( new A));
print $demo->speak(); // I’m from B

最新更新