基本上这就是我想要做的事情:
<?php
class App {
public $var = "main-class";
public function load() {
$this->var = "child-class";
$child = new Child;
$child->echo_var();
}
}
class Child extends App {
public function echo_var() {
echo $this->var;
}
}
$app = new Child;
$app->load();
?>
它输出“main-class”,我希望它输出“child-class”而不必修改子类(因为我希望它是一种“干净”和动态类)。
我接受另一种行动方案的建议
PS:这是我正在努力开发的小型MVC框架的一部分。
答案 0 :(得分:1)
有两种方法可以做到这一点。两者都需要使用构造函数。对于第一个,孩子将在创建时声明自己
<?php
class App {
public $var = "main-class";
public function __construct($var=null) {
if($var !== null) {
$this->var = $var;
}
}
public function load() {
$child = new Child ();
$child->echo_var();
}
}
class Child extends App {
public function __construct(){
parent::__construct("child-class");
}
public function echo_var() {
echo $this->var;
}
}
$app = new Child();
$app->load();
?>
第二个允许父母声明孩子的名字。
<?php
class App {
public $var = "main-class";
public function __construct($var=null) {
if($var !== null) {
$this->var = $var;
}
}
public function load() {
$child = new Child ("child-class");
$child->echo_var();
}
}
class Child extends App {
public function echo_var() {
echo $this->var;
}
}
$app = new Child();
$app->load();
?>
我相信,这两个例子都能奏效并做你想做的事。
答案 1 :(得分:0)
这不是继承的工作方式 - 通过创建新的Child
对象,其数据成员都使用其默认值进行初始化。在父类中执行$this->var = ""
时,您要设置$app
对象的数据成员,而不是$child
对象。
您可以修改子类以包含接受参数的构造函数,并且构造函数将正确设置其数据成员。为了实现类似于你想要的东西,你可以使用构造函数:
<?php
class App {
public $var = "main-class";
public function __construct() {
$this->var = "child-class";
}
public function load() {
$child = new Child;
$child->echo_var();
}
}
class Child extends App {
public function __construct()
{
parent::__construct();
}
public function echo_var() {
echo $this->var;
}
}
$app = new App;
$app->load();
答案 2 :(得分:0)
我觉得很奇怪你的父班真的是他的孩子。通常,您可以实例化孩子,并获得父母的所有功能。
$app = new Child();
$app->load();
问题是你实际上有2种不同的实例。你有一个App的对象,它拥有一个单独的Child对象。
另一种方法是将$ var作为一个静态变量,然后它将独立于实例化而可用。我通常不建议将属性设置为静态。它通常被认为是不好的形式(出于多种原因)。