OOP 继承:当从 X 调用 Y 的方法时,子类 Y(继承自 X)中的 $this 指向 X

OOP-Inheritance: $this in subclass Y (which inherits from X) is pointing to X when method from Y called from X

我有一个庞大的项目,在扩展它的某些方面我想在 subclass Y(继承自 X)中做一些事情 $this 指向XY 的方法从 X 调用时 :) 我不能对 class 结构造成太多干扰,我想在没有任何 "helpers" 的情况下很好地完成它,带有 "controller path" 或类似内容的附加构造函数参数。

所以问题是:当我实例化 ControllerGallery 时,它会调用构造函数,而构造函数会调用父构造函数(来自 ControllerResource,它是 ControllerGallery 的父构造函数)。但是在父构造函数(ControllerResource)中,变量$this指向ControllerGallery,而不是ControllerResource

我知道当我实例化 class 时,只有一个对象被创建(只有“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_PATHControllerResourceControllerProduct class 中都声明了。在 PHP 中,您可以重新声明 public 和受保护的方法,但是由于 ControllerProduct extends ControllerResource 该变量的值将是派生的 class 中的值。如果您将 $CONTROLLER_PATH 属性 的可见性更改为私有,它将仅属于 class,并且不会被覆盖。

PHP Visibility