Достичь дочернего класса до другого дочернего класса

Как это сделать ?

class A {
public anyfunction() {};
/* $B = new B(); */
/* $C = new C(); */
/* its defined there */
}

class B extends A {
function __construct() {
$this->C->func(); // <---- Showing Error Here
}
}

class C extends A {
public function func() {
echo "Hi";
}
}

Я могу использовать B :: func (); но я хочу использовать стиль $ this-> C-> func ()

-1

Решение

Я не уверен, что цель здесь, но мне было любопытно после прочтения вопроса и решил поэкспериментировать с ним. Объект может содержать другой объект, который расширяет его класс.

class A {
// You cannot just do $B = new B(); and $C = new C();.

// You also cannot have a constructor like this:
//   public function __construct() {
//       $this->B = new B;
//       $this->C = new C;
//   }
// because then your constructor becomes recursive and you get an error like:
// Fatal error: Maximum function nesting level of '256' reached, aborting!

// So, you have to pass them as constructor arguments.

public function __construct() {
// Because an A can have a B, or a C, or both, or neither, the constructor
// must be written more flexibly.
foreach (func_get_args() as $obj) {
$this->{get_class($obj)} = $obj;
}
}
}

class B extends A {
public function __construct() {
// Because you are calling the method from C in the constructor of B, you
// have to invoke the constructor of the parent class first so that your B will
// have a C to refer to.
call_user_func_array('parent::__construct', func_get_args());
if (property_exists($this, 'C'))
// Now this works.
$this->C->func(); // <---- echos 'Hi'
}
}

class C extends A {
public function func() {
echo "Hi";
}
}

Тогда вы можете построить B лайк:

$B = new B(new C);

и это скажет

Привет

Это странно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector