OOP がどのように機能するかを理解するのに問題があると思います。動作するようにコードを変更しましたが、それは私が考える正しい方法ではありません。次のシナリオ (いいえ、ユーザー ログインを自分で作成しているわけではありません。実際には、ローカルの開発者が OOP をよりよく理解するためだけのものです):
database.php ファイルがあります:
リーリーしたがって、このクラスではデータベース接続を作成し、その接続 (オブジェクト?) を返します。
次に、2 番目のクラス、有名な User クラスを用意します (実際には自動読み込みを使用しませんが、私はそれについて知っています):リーリー
これらは私の 2 つのコースです。ご覧のとおり、大したことはありません。ここで、関数名login に混乱しないでください。実際には、データベースからいくつかのユーザー名とユーザーメールを選択して表示しようとしているだけです。私はこれを次のようにして達成しようとします:
リーリー
キャッチされないエラー: 未定義のメソッド Database::prepare() の呼び出しそして、このエラーの原因を本当に理解しているのかわかりません。
以下を変更すると、コードは正常に実行されます:
database.php の$conn を private ではなく public に変更します (これはダメだと思います...? ただし、private にすると、データベース クラスでのみ実行できます。クエリは内部で実行されます)そうですか? では、これらのクエリはすべてデータベース クラスに入れる必要がありますか? これは良くないと思います。なぜなら、大きなプロジェクトでは非常に大きくなるからです。)
$this->conn->prepare を
$this->conn->conn->prepare に変更します。ここでは本当に理由がわかりません。
user.php のコンストラクターには
$this->conn = new Database() があり、new Database は DB クラスによって返されるため、接続オブジェクト、なぜ 2 つ目の
conn->
が必要なのか本当にわかりません。
Database
クラスなどのクラスは役に立たないので作成しないでください。 PDO に追加機能を追加する場合、データベース ラッパーを作成することは理にかなっています。ただし、現在のコードを考えると、プレーン PDO を使用する方が良いでしょう。データベース.php:
リーリーuser.php
リーリーapp.php
リーリー出力:
リーリーPDO の詳細については、私の (唯一正しい) PDO チュートリアル をご覧ください。