1

次のようにアクセスすると完全に機能するPHPデータベース接続があります。

$con = mysqli_connect("localhost","username","password","database");  
$result = mysqli_query($con, $query);  

引数として渡すことで、関数でアクセスすることもできます。

function test($con, $args) {
    $query10 = "select name from table where id = '$args[0]'";
    $result10 = mysqli_query($con, $query10);
}

test($con, array('value1','value2'));

ただし、別の関数によって呼び出される関数から接続にアクセスしようとすると:

mainFunction() {
    test($con, array('value1','value2'));
} 

「faultCode0faultStringWarning:mysqli_query() は、パラメーター 1 が mysqli であると想定しています。null が指定されています」というメッセージが表示されます。
変数を mainFunction に渡してから 2 番目の関数に渡すと機能しますが、他のすべての変数にも同じことが当てはまるため、パラメーターが多すぎる非常に読みにくいコードが作成されます。

そこでグローバル変数を使ってみたのですが、なぜかうまくいきません。ランニング

$a = 1;
$b = 2;

function Sum()
{
global $a, $b;

$b = $a + $b;
} 

Sum();
echo $b;  

これは、PHP のドキュメント ( http://php.net/manual/en/language.variables.scope.php ) によると 3 を返す必要が あるため、PHP 構成の何かが間違っていると思われます。

グローバル変数を機能させるにはどうすればよいですか、またはネストされた関数から複数回渡さずに変数にアクセスする別の方法はありますか?

PHP のバージョンは 5.3.10-1ubuntu3.8 で、Zend フレームワークもインストールされています。他の情報が必要な場合はお知らせください。

4

2 に答える 2

1

グローバル変数のテストがうまくいかなかった理由はわかりません。おそらく、表示されていないファイルに他のコードが含まれている可能性がありますが、グローバル変数は一般的に悪い考えと見なされています。

構造化プログラミングの本質は、グローバルな副作用に依存することなく、さまざまなタスクと懸念事項を分離できることです。頻繁に使用されるグローバル変数は、デバッグが難しく、別の実装に置き換えるのが困難です。これは、すべての関数が、いつでもどこからでも変数を取り出すことができることを期待しているためです。

使用するデータベース接続を表すオブジェクトを渡すことは、依存性注入の単純な形式であり、単体テストなどを簡単に行うことができます。

依存性注入ほど完全ではありませんが、後でグローバル変数よりも簡単に変更できるデータベース接続を確立する方法は他にもあります。たとえば、「静的な値」を保持し、呼び出されるたびに同じ接続を返す関数 get_db_connection を定義できます。または、クラス内の静的変数とメソッドで同じことを行います。

于 2013-10-17T11:09:33.937 に答える
0

私の最初の提案は、配列変数を文字列に連結する必要があることです

$query10 = "select name from table where id = '" . $args[0] . "'";

読みやすく、この構文を のように文字列キーで使用できます$args['myvar']

問題の最善の解決策は、データを関数に直接渡し、関数にreturnそれらの値を持たせることです。変数をグローバル化することは直接的な意味では機能するかもしれませんが、変数のスコープを破棄したために、何をしているのかを簡単に見失う可能性があります。

function Sum($a, $b) {
    return $a + $b;
}
$b = Sum($a, $b);
于 2013-10-17T10:46:35.077 に答える