2011-09-17 12 views
4

私は再利用可能な関数を1つのファイル(functions.php)に変換するファイルを持っています。それはそれを必要とするすべてのページにinclude_once() 'です。自分のカスタム関数が自分のスコープ外のMySQL接続にアクセスしようとしているときにエラーが発生します。ソースは次のようなビットです:PHP関数の範囲

なぜ私の関数アクセス変数はスコープの上に宣言されていませんか?私は$connectの宣言の中での機能を再現することによって、成功した接続を得ることができます。

この問題を回避する方法やここで間違っていることについての洞察はありますか?

答えて

6

キーワードはglobalです。また、あなたは再利用可能なコードを作りたい、この

function getmotd($user) { 
    $query = "SELECT cid FROM `users` 
    WHERE id = ".$user; 
    $query = mysql_query($query, $GLOBALS['connect']); // error occurs here, $connect is not a valid MySQL link-resource 
    /* ... */ 
} 

のようにそれを行うことができる場合

function getmotd($user) { 
    global $connect; 
    $query = "SELECT cid FROM `users` 
    WHERE id = ".$user; 
    $query = mysql_query($query, $connect); // error occurs here, $connect is not a valid MySQL link-resource 
    /* ... */ 
} 

、あなたはおそらく、OOPとしたほうが良いと思います。データベースのクラスを作成し、データベース情報のいくつかのプロパティを追加し、キーワードを使用して関数からアクセスします。

+0

完璧!どうもありがとう。回答は8分後に受理されます。 – esqew

+0

+1正確に正解。あなたは 'global'なしで使うことはできません –

5

$ connectは関数の範囲外にあるためアクセスできません。つまり、PHPは内部にあるときに関数内の変数のみを見ることができます。グローバルキーワードを使って、変数が関数のスコープの外にあることをPHPに知らせることができますが、より良い方法は関数への接続を渡すことです。これによりカプセル化が向上します。必要なリソースとデータを渡しながら関数(およびそれ以降のクラス)を書くことを学ぶならば(「依存関係注入」と呼ばれる)、より洗練されたコードを維持することができます。ここにその例があります:

function getmotd($db, $user) { 
    $query = "SELECT cid FROM users WHERE id = " . (int)$user; 
    $result = mysql_query($query, $db); 
    /.../ 
} 

$connect = mysql_connect(...); 
mysql_select_db(...); 
$motd = getmotd($connect, $user); 

これは役に立ちます。

+0

+1私はこの方法を最初に考えていたはずです... –