他のクラスでPDO接続を使用する方法
<p>オブジェクト指向プログラミング (OOP) がどのように機能するかを理解するのが難しいように感じます。動作するようにコードを変更しましたが、それが正しい方法ではないと思います。以下にシナリオを示します (いいえ、ユーザー ログインを自分で作成しているわけではありません。これは OOP をよりよく理解するためだけです): </p>
<p>database.php ファイルがあります:</p>
<pre class="brush:php;toolbar:false;">クラス データベース {
/* 属性 */
プライベート $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を返します;
}
}</pre>
<p>このクラスでは、データベース接続を作成し、その接続 (オブジェクト?) を返します</p>
<p>次に、2 番目のクラス、有名な User クラスを用意します (実際には自動ロードを使用しませんが、それについては知っています)。 </p>
<pre class="brush:php;toolbar:false;">「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 を返します。
}
}
}</pre>
<p>これらは私の 2 つのクラスです。ご覧のとおり、大したことはありません。ここで、関数名 <code>login</code> に混乱しないでください。実際には、データベースからユーザー名とユーザーメールをいくつか選択して表示しようとしているだけです。私は次のようにしてそれを達成しようとしました: </p>
<pre class="brush:php;toolbar:false;">$user = new User();
$list = $user->login();
foreach($list as $test) {
echo $test["ユーザー名"];
}</pre>
<p>ここで問題が発生します。このコードを実行すると、次のエラー メッセージが表示されます。 </p>
<ブロック引用>
<p>キャッチされないエラー: 未定義のメソッド Database::prepare() の呼び出し</p>
</blockquote>
<p>このエラーの原因を本当に理解しているかわかりません。</p>
<p><strong>以下を変更するとコードは正常に動作します: </strong></p>
<p>database.php の <code>$conn</code> を private から public に変更しました (これはダメだと思います...? しかし、private にすると、Database クラスでしか使用できなくなります。Query は内部的に実行されますよね? では、これらのクエリはすべて Database クラスに入れるべきでしょうか? 大きなプロジェクトでは非常に巨大になるため、これは良くないと思います...) </p> ;
<p>2 番目の変更は次のとおりです: </p>
<p>user.php ファイルの <code>$this->conn->prepare</code> を <code>$this->conn->conn->prepare< / に変更します。コード>。これについては本当にわかりません。 </p>
<p>つまり、<code>user.php</code> のコンストラクターには、<code>$this->conn = new Database()</code> があります。新しいデータベースなのでDB クラスから接続オブジェクトを返しますが、なぜ 2 番目の <code>conn-></code></p> が必要なのか本当にわかりません。