他のクラスでPDO接続を使用する方法
P粉293550575
P粉293550575 2023-08-24 15:10:58
0
1
385

オブジェクト指向プログラミング (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->

が必要なのか本当にわかりません。
P粉293550575
P粉293550575

全員に返信 (1)
P粉451614834
  • Databaseのようなクラスはほとんど役に立たないため、作成しないでください。 PDO に追加機能を追加する場合、データベース ラッパー クラスを作成することは理にかなっています。ただし、現在のコードを考えると、生の PDO を使用する方が良いでしょう。
  • 元の PDO またはデータベース クラスから単一の$db インスタンスを作成します。
  • これをコンストラクター パラメーターとしてデータベース接続を必要とするすべてのクラスに渡します。

データベース.php:

リーリー

user.php

リーリー

app.php

リーリー ###出力:### リーリー

PDO の詳細については、私の

(唯一正しい) PDO チュートリアル

を参照してください。

いいねを押す+0
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート
    私たちについて 免責事項 Sitemap
    PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!