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