Наследование ООП: $ this в подклассе Y (который наследуется от X) указывает на X, когда метод из Y вызывается из X

У меня огромный проект, и в какой-то момент я хочу что-то сделать $this в подклассе Y (который наследует от X) указывая на X когда метод из Y звонил из X 🙂 Я не могу мешать многим в структуре классов, и я хочу сделать это НИЧЕГО без каких-либо «помощников», дополнительных параметров конструктора с «путем к контроллеру» или чем-то в этом роде.

Итак, проблема в том, что когда я создаю экземпляр ControllerGallery он вызывает конструктор, который вызывает родительский конструктор (из ControllerResource который является родителем ControllerGallery). Но в родительском конструкторе (ControllerResource), переменная $this указывает на ControllerGalleryне ControllerResource,

Я знаю, что когда я создаю экземпляр класса, создается только один объект (только «ControllerGallery«, а не:»ControllerGallery и это родитель ControllerResource«), и в этом проблема. Мой вопрос: как добиться результата, который показан ниже? Есть предложения?

<?php

abstract class Controller {
function getParentController()
{
return null;
}

function getController(){
return $this;
}
}

class ControllerResource extends Controller
{
protected $CONTROLLER_PATH = 'Resource';
protected $scripts;

function __construct(){
$this->addScript($this->CONTROLLER_PATH.DIRECTORY_SEPARATOR.'general_resource_support_script.js');
}

function addScript($name){
$this->scripts[] = $name;
}

function getParentController()
{
return parent::getController();
}

function getScriptPaths(){
return $this->scripts;
}
}

class ControllerProduct extends ControllerResource
{
protected $CONTROLLER_PATH = 'Product';
function __construct(){
parent::__construct();
$this->addScript($this->CONTROLLER_PATH.DIRECTORY_SEPARATOR.'product_support_scripts.js');
}
}

class ControllerGallery extends ControllerResource
{
protected $CONTROLLER_PATH = 'Gallery';
function __construct(){
parent::__construct();
$this->addScript($this->CONTROLLER_PATH.DIRECTORY_SEPARATOR.'gallery_scripts.js');
}
}



$controllerProduct = new ControllerProduct();
$controllerGallery = new ControllerGallery();

echo('<pre>');
print_r($controllerProduct->getScriptPaths());
print_r($controllerGallery->getScriptPaths());
echo('</pre>');

echo('
<pre>
<b>SHOULD BE:</b>
Array
(
[0] => <b>Resource</b>\general_resource_support_script.js
[1] => Product\product_support_scripts.js
)
Array
(
[0] => <b>Resource</b>\general_resource_support_script.js
[1] => Gallery\gallery_scripts.js
)
</pre>
');


?>

И мы получаем результат:

Array
(
[0] => Product\general_resource_support_script.js
[1] => Product\product_support_scripts.js
)
Array
(
[0] => Gallery\general_resource_support_script.js
[1] => Gallery\gallery_scripts.js
)

Но это должно быть:

Array
(
[0] => Resource\general_resource_support_script.js
[1] => Product\product_support_scripts.js
)
Array
(
[0] => Resource\general_resource_support_script.js
[1] => Gallery\gallery_scripts.js
)

0

Решение

protected $CONTROLLER_PATH объявлен в обоих, ControllerResource а также ControllerProduct классы. В PHP вы можете переопределить публичный и защищенный метод, но так как ControllerProduct extends ControllerResource значение этой переменной будет значением в производном классе. Если вы измените видимость $CONTROLLER_PATH свойство private будет принадлежать только этому классу и не будет переопределено.

PHP видимость

0

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

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

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