假设我有三节课。一个是父母,两个是“孩子”。但是,我没有使用class - extends -
:
class root
{
function root(){
$this->son = new son();
$this->daughter = new daughter();
}
}
class son
{
...
}
class daughter
{
...
}
如何从 daughter 的函数中调用 son 的函数?换句话说,我如何从 son / daughter 中引用 root 类,以便我可以相互调用彼此的函数?
答案 0 :(得分:1)
这里唯一可行的方法是将引用显式传递给根类对象:
function root(){
$this->son = new son($this);
$this->daughter = new daughter($this);
}
并在son
和daughter
构造函数中接受它。
class son
{
private $root;
public function son($root)
{
$this->root = $root;
}
}
class daughter
{
private $root;
public function daughter($root)
{
$this->root = $root;
}
public function doSomethingToBrother()
{
$this->root->son->some_method();
}
}
答案 1 :(得分:1)
依赖注入的典型案例。
class root {
function root() {
$this->son = new son($this);
$this->daughter = new daughter($this);
}
}
class son {
function __construct($parent) {
$this->parent = $parent;
}
function foo() {
$this->parent->daughter->bar();
}
}
注意不要在不应该拥有它们的类之间创建严格的依赖关系。继承可能是更好的方法。替代方案包括注册表模式和工厂模式。
答案 2 :(得分:0)
由于子和子实际上不是root的子类,因此调用彼此函数的唯一方法是从那里获取实例和调用。除非函数声明为static,否则你可以通过son :: my_func()/ daughter :: my_func等来调用它们。
我不确定目标是什么,但也许这会有所帮助:http://php.net/manual/en/language.oop5.patterns.php
答案 3 :(得分:0)
如果要在它们之间调用方法,则必须将root实例传递给子或子。或者,如果它不依赖于实例,请使用静态方法。
答案 4 :(得分:0)
例如,希望自己说话,重要的是:
a)$this->son = new Son($this);
- 其中对Root
对象的引用分别传递给新的Son
类(或Daughter
)。
b)echo $son->root->daughter->aboutme();
- 其中引用用于访问其他对象,root可能有权访问。
可以认为这是一种Mediator pattern。
<?php
class Root
{
function __construct(){
$this->son = new Son($this);
$this->daughter = new Daughter($this);
}
function aboutme() { print "I'm root.\n"; }
}
class Son
{
function __construct($root) {
$this->root = $root;
}
function aboutme() { print "I'm a son.\n"; }
}
class Daughter
{
function __construct($root) {
$this->root = $root;
}
function aboutme() { print "I'm a daughter.\n"; }
}
$root = new Root();
echo $root->aboutme();
$son = $root->son;
echo $son->aboutme();
echo $son->root->daughter->aboutme();
?>
这将产生:
I'm root.
I'm a son.
I'm a daughter.