オブジェクト指向プログラミング (OOP) がどのように機能するかを理解するのが難しいように感じます。動作するようにコードを変更しましたが、それが正しい方法ではないと思います。以下にシナリオを示します (いいえ、ユーザー ログインを自分で作成しているわけではありません。これは OOP をよりよく理解するためだけです):
database.php ファイルがあります:
クラス データベース { /* 属性 */ プライベート $conn; プライベート $dsn = 'mysql:dbname=test;host=127.0.0.1'; プライベート $user = 'root'; プライベート $パスワード = ''; /* データベース接続を作成します */ パブリック関数 __construct() { 試す { $this->conn = 新しい PDO($this->dsn, $this->ユーザー, $this->パスワード); } キャッチ (PDOException $e) { print "エラー!: " . $e->getMessage() . ""; 死ぬ(); } $this->connを返します; } }
このクラスでは、データベース接続を作成し、その接続 (オブジェクト?) を返します
次に、2 番目のクラス、有名な User クラスを用意します (実際には自動ロードを使用しませんが、それについては知っています)。
「database.php」を含める; クラス ユーザー { /* 属性 */ プライベート $conn; /* データベースアクセスを取得します */ パブリック関数 __construct() { $this->conn = 新しいデータベース(); } /* ログインユーザー */ パブリック関数login() { $stmt = $this->conn->prepare("SELECT username, usermail FROM user"); if($stmt->execute()) { while($rows = $stmt->fetch()) { $fetch[] = $rows; } $fetch を返します。 } それ以外 { false を返します。 } } }
これらは私の 2 つのクラスです。ご覧のとおり、大したことはありません。ここで、関数名 login
に混乱しないでください。実際には、データベースからユーザー名とユーザーメールをいくつか選択して表示しようとしているだけです。私は次のようにしてそれを達成しようとしました:
$user = new User(); $list = $user->login(); foreach($list as $test) { echo $test["ユーザー名"]; }
ここで問題が発生します。このコードを実行すると、次のエラー メッセージが表示されます。
<ブロック引用>キャッチされないエラー: 未定義のメソッド Database::prepare() の呼び出し
このエラーの原因を本当に理解しているかわかりません。
以下を変更するとコードは正常に動作します:
database.php の $conn
を private から public に変更しました (これはダメだと思います...? しかし、private にすると、Database クラスでしか使用できなくなります。Query は内部的に実行されますよね? では、これらのクエリはすべて Database クラスに入れるべきでしょうか? 大きなプロジェクトでは非常に巨大になるため、これは良くないと思います...)
2 番目の変更は次のとおりです:
user.php ファイルの $this->conn->prepare
を $this->conn->conn->prepare< / に変更します。コード>。これについては本当にわかりません。
つまり、user.php
のコンストラクターには、$this->conn = new Database()
があります。新しいデータベースなのでDB クラスから接続オブジェクトを返しますが、なぜ 2 番目の conn->
Database
のようなクラスはほとんど役に立たないため、作成しないでください。 PDO に追加機能を追加する場合、データベース ラッパー クラスを作成することは理にかなっています。ただし、現在のコードを考えると、生の PDO を使用する方が良いでしょう。データベース.php:
リーリーuser.php
リーリーapp.php
リーリー ###出力:### リーリーPDO の詳細については、私の
(唯一正しい) PDO チュートリアルを参照してください。