4

私はここで学習モードにあり、PHPは非常に新しいので、コードサンプルを使用しています。ここでの「グローバル」の使用はご容赦ください。ただし、php変数のスコープについて理解したいと思います。

myGlobals.phpは次のとおりです。

<?php 
     global $db_server;
   // other code not shown
?>

これがconnectToDb.phpです:

<?php
      require_once 'myGlobals.php';

      // no declared functions in this file, all inline code
      $db_server = mysql_connect(.....);
      mysql_select_db( "theDatabase", $db_server);
?>

addDbRecords.phpは次のとおりです。

<?php
       require_once 'myGlobals.php';

       // other inline code.....
       doAddDeleteRecord($db_server);

function doAddDeleteRecord($db_server)
{
  //global $db_server;

  if( !mysql_query($query, $db_server))
   {
         // handle the error...
   }
 }
?>

これがindex.phpです:

<?php
      require_once 'myGlobals.php';
      require_once 'connectToDb.php';
      require_once 'addDbRecords.php';

     // this is simplified, just trying to show that everything in inline code
 ?>

ここに問題があります。doAddDeleteRecord($db_server)上記のファイルaddDbRecords.php内で呼び出すと、$db_server無効になります-nullになります-呼び出すmysql_query(.., $db_server, ...) と、これはエラーメッセージです。

「警告:mysql_query()は、パラメーター2がリソースであると想定しています。29行目のC:\ xampp \ htdocs\addDbRecords.phpでnullが指定されています。」

そこで、内部で「グローバル」宣言を使用してみdoAddDeleteRecord()ました(上記でコメント)-変更はありません。
それでも、のmysql_query(...)値がNULLの場合は失敗します$db_server

mysql_connect(....)他のコードが(SELECTを使用して)データベースからすべてのレコードを正常に引き出し、既存のレコードがブラウザーに正しく表示されるため、動作がわかります。

$db_serverしたがって、私の意見では、「グローバル」で宣言されているという事実は、のスコープ$db_serverが一度mysql_connect(...)呼び出されるようなものであることを意味するはずです-すべてのファイルのファイルスコープで$db_server、データベースへの有効な接続になります。

私はphpスコーピングについてのみ学習しようとしており、OOADやその他のことについては学習しようとしていません(今のところ)。なぜ$db_server()ここでnullなのですか?

4

2 に答える 2

5

だから、あなたは持っています:

<?php 
     global $db_server;
   // other code not shown
?>

必要に応じてこれを含めます。

require_once 'myGlobals.php';
// other inline code.....
doAddDeleteRecord($db_server);

問題は、すでに「myGlobals.php」を他の場所に含めている場合、ここには含まれないことです。したがって、グローバルがスコープに含まれることを保証することはできません。

代わりに、次のように記述します。

require 'myGlobals.php';
// other inline code.....
doAddDeleteRecord($db_server);

または、次のようなはるかに優れたアプローチを取ります。

// other inline code.....
doAddDeleteRecord($GLOBALS['db_server']);
于 2011-06-10T18:13:36.970 に答える
1

スコープの非表示に懸念があると思います。つまり、グローバル変数と関数ローカル変数に同じ名前($ db_server)を使用しています。関数localscopeは、グローバル変数名を非表示にします。グローバルがある場合は、それを関数に渡す必要はありません。その場合は、同じ名前を使用しないでください。

于 2011-06-10T18:16:56.410 に答える