0

一部のコードをリファクタリングしようとしていますが、少し混乱しています。データベース接続を次のように定義します。

try{
    global $conn;
    $conn = new PDO("mysql:host=$host",$root,$pw); [...]

ここで、テーブルの行を取得するための関数が必要ですが、必要$connです。$connこの関数に渡す方法はありますか?デフォルト値として設定しようとしましたが、機能しません。

function get($table,$conn=$conn,$limit=10){ [...]

次にキーワードを試しましたuseが、匿名関数でのみ使用できると思います。

function get($table,$limit=10)use($conn){
    $query = $conn->query(" [...]

他の人はこれをどのように行いますか?ここで明らかな何かが欠けていますか?

4

4 に答える 4

4
function get($table, $limit=10)

すでに質問に書いているように、この関数ヘッダーは不完全です。関数自体は、を持たずに必要なことを実行することはできません$conn

これはグローバル名前空間の関数であるため、最も簡単なことはグローバル変数を使用することです。

function conn_get($table, $limit=10) {

    global $conn;

また、関係を明確にするために関数に名前を付けました。これに伴う問題は2つあります。

  1. グローバル関数は維持するのに費用がかかります
  2. グローバル変数は維持するのに費用がかかります

したがって、その場合に通常行うことは、これをクラスにラップすることです。

class Conn
{
    private $conn;

    public function __construct(PDO $conn) {

        $this->conn = $conn;
    }

    public function get($table, $limit=10) {

       $query = $this->conn->query("[...]");
       ...
    }
}

Conn次に、使用できるオブジェクトを渡します。

$pdo  = new PDO("mysql:host=$host", $root, $pw);
$conn = new Conn($pdo);

その後:

$conn->get('ColorTable', 200);

プライベート変数はグローバル変数の役割を引き継ぎ、同じオブジェクト内のすべてのメソッドがそれにアクセスできるという利点があります。ですから、今ではすべてがそれ自身の空間にあり、グローバルな空間とは反対に、それほど速くお互いに入ることができません。これは、時間の経過とともに変更および保守するのが簡単(簡単)です。

于 2012-12-29T15:42:10.053 に答える
0

関数を呼び出すとき、すなわち:

$table_rows = get($table, $conn);

関数スコープ内でローカル変数を渡します。

ただし、非静的変数をデフォルトとして定義することはできません$conn=$conn。致命的なエラーがスローされます。

于 2012-12-29T15:38:12.120 に答える
0

あなたができる最も簡単なことはあなたに$conn変数を返す関数を作成することです

function conn (){
   $conn = NULL;
   ...some database connection setup etc...
   return $conn;
}

使用する必要のある他の関数に呼び出します

function getDb(){
 conn()->query(" [...]");
}

このconn()関数は、PHPスクリプトのすべての関数で使用できます。

ただし、より複雑なWebアプリケーションを作成する場合は、PHPフレームワークを使用するか、PHPクラスを作成して、データベース接続を処理するOOP原則を適用することをお勧めします。

于 2012-12-29T15:38:21.437 に答える
0

PHPでは、use無名/ラムダ関数を使用する方法ですが、通常の関数は使用できません。

データベース接続がグローバルスコープで飛び回っている場合は、次のように、通常の変数として関数に渡すことができます。

function get(PDO $conn, $table,$limit=10) {
    $query = $conn->query(" [...]
}

それ以外(悪い習慣です!)は、グローバル$conn変数を次のように関数に取り込むことです。

function get($table,$limit=10) {
    $query = $GLOBALS['conn']->query(" [...]
}

ただし、オブジェクト指向のアプローチをお勧めします。必要に応じて、依存性注入を介してデータベースクラスをクラスに注入することをお勧めします。

于 2012-12-29T15:40:38.170 に答える