1

まず、この質問は重複していません。理由は次のとおりです。このトピックに関する私の以前の質問は、これ(すべてのもの)の複製として閉じられました。それは少しも役に立ちませんでした-私はいまいましいことを理解していませんでした. 私は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コードから削除するにはどうすればよいですか? データベース ハンドラ クラスを作成し、接続設定をインスタンス化するたびにコンストラクタ メソッドに渡し、代わりにそれを使用しますか? (少し冗長なようです)。

グローバル変数の使用を置き換える方法がよくわからないので、理解できるように助けていただければ幸いです。

4

2 に答える 2

1

非常に大まかに言えば、ここでスコープについて質問 しています。コードを書く前に理解しておくと役立つ特定の理論がいくつかあります。魅力的に見えることもありますが、一歩下がって理論を学ぶことは、ここで非常に役立ちます。

あなたがリンクした答えは、依存性注入の説明に直接ジャンプしますが、これは開始するのに適した場所かもしれません (依存性注入を 5 歳児に説明するにはどうすればよいですか? ) 特にこのコメント: https://stackoverflow.com/a /1639321/181707

最後に、このようなことを処理するいくつかの単純なフレームワークを見て、ソース コードを読んで学ぶことをお勧めします。

非常にシンプルな依存性注入コンテナーは Pimple です。

http://pimple.sensiolabs.org/

イントロダクションをざっと見てみましょう。怖くはなく、概念を理解するのに役立ちます。

于 2013-03-27T05:38:23.280 に答える
-1

クラスを拡張することで、コードの冗長な使用を避けることができます。新しいクラスは、拡張されたクラスからすべての public 関数と protected 関数を取得します。

<?php
//$dbh stuff up here

class Main{
   public $dbh;
   function __construct() { //this magic function runs when the class is initiated.
       global $dbh;
       $this->dbh = $dbh;
       //dbh will be accessible for this whole class using $this->dbh 
   }
}

class imageClass extends Main{
    public function test(){
       if (isset($this->dbh){
           echo "it works";
       }
    }
}

class userClass extends Main{
   function __construct(){
       //this construct function overwrites the construct function in main so dbh
       //will not be accessible in this class
   }
}

imageFunc::test();

コードを再利用しないことに関心があるなら、なぜすべてのページの上部に init.php を必要とするのですか!! Model-View-Controller フレームワークを調べたいと思うかもしれません。私は Cakephp.org のブログ チュートリアルから始めました。MVC http://www.youtube.com/playlist?list=PL7A20112CF84B2229を作成するチュートリアルである YouTube の jream をご覧ください。

于 2013-03-27T05:46:58.100 に答える