まず、この質問は重複していません。理由は次のとおりです。このトピックに関する私の以前の質問は、これ(すべてのもの)の複製として閉じられました。それは少しも役に立ちませんでした-私はいまいましいことを理解していませんでした. 私はOOPにまったく慣れていません-私の理解レベルに合わせた回答が必要です-リンクされた質問への回答が何について話しているのかわかりませんでした。質問が似ているように見えるからといって、質問者はそうではないかもしれません-とにかく、私の理解レベルに対する「理解できる」回答を前の質問で具体的に要求しました。それで、私はもう一度尋ねます(そして、必要に応じて、もう一度)。ここに行きます:
私はまだPHP全体にかなりの初心者であり、オブジェクト指向PHPについてはさらに新しく、先週以内に自分自身を教育し始めたばかりであり、継承やクラスの抽象化などのいくつかの概念をまだ理解できていません。しばらくの間、データベース接続とクエリを処理するために PDO を使用してきたので、かなり迅速に理解することができましたが、それ以外はまだ OOPHP の初心者です。少し「基本的」に思えます。
各 Web ページの上部に必要な初期化ファイル (init.php) があります。これは、とりわけ、PDO を使用して MySQL データベースに接続します。
試す { $dbh = new PDO(conn. data here); } catch(PDOException $e) { echo $e->getMessage(); }
したがって、私が理解しているように、このコードを実行する$dbh
と、PDO オブジェクトとしてインスタンス化されます。私のinit.phpファイルの一番下には、、、などの関数ファイルへのリンクが必要user.func.php
ですimages.func.php
。
問題は、関数の 1 つからデータベースにクエリを実行する必要があるときはいつでも、次の$dbh
ように操作する前にグローバルとして宣言する必要があることです。
関数 myFunction { グローバル $dbh; // ここが問題です! 試す { $stmt = $dbh->prepare(ここにいくつかの SQL); $stmt->execute(); }キャッチ{ //など。 } }
さて、問題は、なぜグローバルとして宣言しなければならないのかを理解することではありません-それは十分に理解していますが、どうすればそれを回避できますか。グローバルを避ける理由についていくつかの StackOverflow の回答を読みましたが、その方法がわかりません。
global $dbh
コードから削除するにはどうすればよいですか? データベース ハンドラ クラスを作成し、接続設定をインスタンス化するたびにコンストラクタ メソッドに渡し、代わりにそれを使用しますか? (少し冗長なようです)。
グローバル変数の使用を置き換える方法がよくわからないので、理解できるように助けていただければ幸いです。