これは非常に具体的な問題であり、どこにも答えが見つかりません。これは多くの言語に当てはまりますが、私は特に PHP でそれを理解したいと思っています。このために、「イベント」をクラスとして使用します。簡単に言うと2種類あります。
abstract class Event{
protected $cost;
protected $startTime;
public function __construct(){
foreach($eventData as $key => $val){
if(property_exists($this, $key)){
$this->$key = $val;
}
}
}
}
と
class Party extends Event{
private $hasPointyHats;
public function __construct($eventData){
parent::__construct($eventData);
$this->hasPointyHats = $eventData->hasPointyHats;
}
}
クラス Event には、cost と startTime の 2 つの props があります。構築時に、イベントのすべてのパラメーターを含む連想配列を渡す必要があり、渡された配列値にプロパティが自動的に設定されます。
Class Party は、このイベントに素晴らしい先のとがったパーティー ハットがあるかどうかを確立することで、Event を拡張します (ない場合は行きません)。
いいえ。いいえ、そうではありません。このオブジェクトを渡すと、次のようになります。
//Some result set...
$mysqli_result = $result->fetch_assoc();
cost、startTime、および hasPointyHats の値 (おそらくそれ以上) を持つ場合、次の小さなエラーが発生します。
Fatal error: Cannot access private property Party::$hasPointyHats in C:\somePath\Event.php on line 35
理由はわかりました。「イベント」では、 $this は「パーティー」オブジェクトを参照しますが、プライベートであるためです。スーパー コンストラクター内のオブジェクトのすべてのプロパティを上書きしようとしているわけではなく、スーパー クラス (抽象クラス Event) 自体に属するものだけを上書きしようとしています。子クラスのプロパティではなく、Event クラスの特定のプロパティをターゲットにする方法はありますか? そうすれば、どのオブジェクトを拡張しても、渡されたオブジェクトに競合するプロパティがあったために、誤って子クラスにプロパティを設定してしまうことはありませんか?
super->property などのばかげた簡単なものだと思いますが、それで property_exists を使用できるようにする必要があります。
事前に助けてくれてありがとう。