9

私はphp初心者です(ただし、他の言語では長年の開発者です)。「PHP、MySQL、およびJavaScript」でいくつかのデータベース接続の例を試しています。これは、db接続変数(サーバー名、ユーザー名、パスワード、データベースなど)を含むサンプルファイルを示しています。私が書いたいくつかの関数を含むphpファイルがあり、そのうちの1つにはいくつかのSQLクエリがあります。何らかの理由で、そのファイルでrequire_onceを呼び出してもエラーは出力されませんが(E_ALLを構成しています)、データベースのphpファイルのこれらの変数はnullです。

その関数内のすべての変数を使用してエコーを呼び出し、一体何が起こっているかを確認しました。もちろん、空白行を出力します。世界の何が範囲外ですか?私は単純な何かを見逃している必要があります。

これが私がしていることの例です

db_login.php

<?php
    $db_server = 'localhost';
    // ....
?>

関数.php

<?php
    require_once('db_login.php');

    function myfunction() {
        echo "$db_server";
        // ...
    }
?>

私をクレイジーと呼んでください、しかしこれは働くのに十分単純であるべきではありませんか?

4

3 に答える 3

8

PHPにはJavascriptのような関数スコープがないdb_login.php、の関数内functions.php

これに対処する方法は複数あります。サーバー名を使用している可能性があるため、グローバル定数は何も変更できないため、おそらく良い解決策になります。

あなたの場合、あなたは次のことができます:

<?php
    require_once('db_login.php');
      // You have access to $db_server here.
      // Create a constant.
    define("DB_SERVER", $db_server);

    function myfunction() {
          // Using a constant. Note that there is no "$".
        echo DB_SERVER ;
          // Constants are interpreted inside double quotes too
        echo "\nMy constant is DB_SERVER";
        // ...
    }
?>

あなたの場合、サーバー名を定数として持つのがおそらく適切です。真の変数として扱いたいものを扱っている場合は、値または参照によって変数を関数に渡すことができます。

myfunction($variable);

  // by value
function myfunction($pass_variable_to_me_by_value)
{
    echo $pass_variable_to_me_by_value;
    // ...
}

function myfunction(& $pass_variable_to_me_by_reference)
{
    echo $pass_variable_to_me_by_reference;
    // ...
}

注意として、あなたの場合、関数内でglobalキーワードまたは$ GLOBALS配列を使用することは、基本的に参照渡しと同じです。、ただし、グローバルスコープから渡さない場合、それらは非常に異なる可能性があります(たとえば、クラス内または別の関数から)。

于 2010-09-01T04:29:35.400 に答える
6

宣言する変数db_login.phpはグローバルです。関数内でそれらにアクセスするには、$GLOBALS変数などを使用するか、キーワード$GLOBALS['db_server']を使用して関数内でグローバルとして宣言する必要があります。globalglobal $db_server

于 2010-09-01T04:21:39.707 に答える
5

関数「myfunction」の内部では、これらの変数にアクセスできません...

詳細については、http://php.net/manual/en/language.variables.scope.phpを参照してください。

于 2010-09-01T04:20:28.180 に答える