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
指向X
当 Y
的方法从 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_PATH
在 ControllerResource
和 ControllerProduct
class 中都声明了。在 PHP 中,您可以重新声明 public 和受保护的方法,但是由于 ControllerProduct extends ControllerResource
该变量的值将是派生的 class 中的值。如果您将 $CONTROLLER_PATH
属性 的可见性更改为私有,它将仅属于 class,并且不会被覆盖。
我有一个庞大的项目,在扩展它的某些方面我想在 subclass Y
(继承自 X
)中做一些事情 $this
指向X
当 Y
的方法从 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_PATH
在 ControllerResource
和 ControllerProduct
class 中都声明了。在 PHP 中,您可以重新声明 public 和受保护的方法,但是由于 ControllerProduct extends ControllerResource
该变量的值将是派生的 class 中的值。如果您将 $CONTROLLER_PATH
属性 的可见性更改为私有,它将仅属于 class,并且不会被覆盖。