2

私はいくつかのクラスを次のように設定しています。ここで、-> は「拡張」を意味します。

DBObject -> Article -> Activity

DBObject__constructには、データベースからオブジェクトを簡単にロードするためのジェネリックが含まれています (したがってDataBaseObject)。

Article__construct特殊なコンストラクターの動作のために、this をオーバーライドします。

Activityは、そのスーパークラス( )__constructによって処理できるため、 を実装していません。__constructArticle::__construct

でも、なぜか電話したら

$activity = new Activity($args);

で終わりDBObject::__construct、Article のものをまとめて渡します。サブクラスの呼び出しは、一度に 1 クラスずつサブクラスの行を上っていくものだといつも思っていました。そう思う私は間違っているのでしょうか?

編集: ここにコード スニペットがあります: http://pastebin.com/SXpSNVMm。不要なコードをすべて削除しました。私はそれを次のように呼んでいます:

$userId = 60;
$title = "TestTitle";
$contents = "Lorem ipsum dolor sit amet";
$date = 1356173771;

echo "creating new activity\n";
$a = new Activity($userId, $title, $contents, $date);

コンストラクターにエコーを配置するArticle::__construct()と、それが使用されていないことが明らかになり、すぐにDBObject::__construct().

編集 2 : これは正しく動作するはずのバージョンです: http://ideone.com/VJzdI3 . テストにはPHPUnitを使用しています。これは、PHPUnit で実行した場合の出力です。

creating new activity 
DBObject constructed called 
QUERY: 60 ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '60' at line 1

後者は、meekrodb を使用して初期化しようとしていることを意味します。これは、または配列new以外のものを使用して DBObject のサブクラスを呼び出した場合にのみ発生するはずです。nullただし、Article は __construct をオーバーライドする必要があるため、最初に呼び出す必要があります。

4

1 に答える 1

2

あなたの理解は正しいです。あなたが説明するセットアップでは、新しい作成Activityは間違いなく「延期」されArticle::__constructます。そうでない場合は、説明と実際のコードがどこかで異なっている必要があります。PHP にはかなりの数のバグがありますが、これは非常に単純なシナリオで、驚くべき動作をバグのあるコードに帰するものです。

それでもコードに問題がないと思われる場合は、問題を示す htpp://ideone.com などのオンライン コードパッドに実際のサンプルを投稿してください。

于 2012-10-22T10:40:22.100 に答える