Вызов функции через рекурсию класса?

В моем коде у меня есть два класса — первый «Foo» инициирует второй «Бар» … что я хочу сделать, это найти какой-то метод использования функций и переменных от родителя.

class Bar {
function __construct() {
/*
* From within this function, how do I access either the returnName() function
* OR the $this -> name variable from the class above this?
* The result being:
*/
$this -> name = parent::returnName();
$this -> else = parent -> name;
}
}

class Foo {
function __construct() {
$this -> name = 'Fred';
$this -> var = new Bar();
}

function returnName() {
return $this -> name;
}
}

$salad = new Foo();

Я понимаю, что синтаксис «родитель» относится либо к реализации, либо к расширению, но возможно ли использовать этот метод?

2

Решение

Вы можете ввести $this (класс Foo) в конструкторе Bar

<?php
class Bar {
function __construct($fooClass) {
/*
* From within this function, how do I access either the returnName() function
* OR the $this -> name variable from the class above this?
* The result being:
*/
$this -> name = $fooClass->returnName();
$this -> else = $fooClass -> name;
}
}

class Foo {
function __construct() {
$this -> name = 'Fred';
$this -> var = new Bar($this);
}

function returnName() {
return $this -> name;
}
}

$salad = new Foo();
3

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

Обращаться осторожно

Это не 100% чистое решение, но будет работать. Ваш код должен быть хорошо документирован, чтобы избежать путаницы в будущем.

Есть очень крутая функция под названием debug_backtrace ()

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

Вот как вы можете использовать это:

class Bar {
function __construct() {

//get backtrace info
$trace = debug_backtrace();
//get the object from the function that called class
//and call the returnName() function
$this->name = $trace[1]['object']->returnName();
echo $this->name;

//want more info about backtrace? use print_r($trace);
}
}

class Foo {
function __construct() {
$this -> name = 'Fred';
$this -> var = new Bar();
}

function returnName() {
return $this -> name;
}
}

$salad = new Foo();

Результат:

Фред

0

По вопросам рекламы [email protected]