В моем коде у меня есть два класса — первый «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();
Я понимаю, что синтаксис «родитель» относится либо к реализации, либо к расширению, но возможно ли использовать этот метод?
Вы можете ввести $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();
Обращаться осторожно
Это не 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();
Результат:
Фред