ほぼ同じメソッドとプロパティを共有し、どちらも親クラスを拡張する 2 つのクラスを想像してみてください。ただし、違いは最小限です。
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>