想象一下,两个类共享几乎完全相同的方法和属性,都扩展了父类,但差异很小。
class fields {
public function __construct() {
global $id;
$this->id = $id++;
}
}
class input extends fields {
public function __construct() {
parent::__construct();
}
public function draw() {
echo '<input>';
}
}
class textarea extends fields {
public function __construct() {
parent::__construct();
}
public function draw() {
echo '<textarea>';
}
}
我认为以这种伪代码方式重写 textarea 类会更有效:
class textarea extends fields {
public function __construct() {
$this = new input(); // <<------
}
public function draw() {
echo '<textarea>';
}
}
基本上,我不确定如何最好地做到这一点,以便该类的行为类似于第一个示例中的类。
本质上,我想使用 OOP 执行以下操作,但能够像上面第一个示例中那样使用对象(能够调用可能重载的方法,具有不同的属性等):
function a() {echo '123';}
function b() {a();}
刚刚把整个类都抄下来了,修改了几行,感觉很浪费。
最终答案 感谢这些人,这是与示例调用的组合答案:
abstract class fields {
private static $masterid = 0;
public function __construct() {
$this->id = self::$masterid++;
}
}
class input extends fields {
public $data;
public function __construct($new = '') {
parent::__construct();
if ($new) $this->data = $new;
else $this->data = 'Hello';
}
public function draw() {
echo '<input>'.$this->export().'</input>';
}
public function export() {
return 'ID '.$this->id.' = '.$this->data;
}
}
class textarea extends input {
public function __construct($new = '') {
parent::__construct($new);
}
public function draw() {
echo '<textarea>'.$this->export().'</textarea>';
}
}
$a = new textarea();
$a->draw();
$a = new textarea('World');
$a->draw();
$a = new input('!');
$a->draw();
//Outputs:
// <textarea>ID 0 = Hello</textarea>
// <textarea>ID 1 = World</textarea>
// <input>ID 2 = !</input>