У меня огромный проект, и в какой-то момент я хочу что-то сделать $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
)
protected $CONTROLLER_PATH
объявлен в обоих, ControllerResource
а также ControllerProduct
классы. В PHP вы можете переопределить публичный и защищенный метод, но так как ControllerProduct extends ControllerResource
значение этой переменной будет значением в производном классе. Если вы измените видимость $CONTROLLER_PATH
свойство private будет принадлежать только этому классу и не будет переопределено.
Других решений пока нет …