3

次の状況を考えてみましょう

ファイル: ./include/functions/table-config.php 以下を含む:

.
.
$tablePages = 'orweb_pages';
.
.

ファイル: ./include/classes/uri-resolve.php 以下を含む:

class URIResolve {
.
.
$category = null ;
.
.
function process_uri() {
...
    $this->category = $tablePages;
...
}
.
.
}

ファイル: ./settings.php 以下を含む:

.
.
require_once(ABSPATH.INC.FUNC.'/table-config.php');
require_once(ABSPATH.INC.CLASS.'/uri-resolve.php');
.
.
これは機能しますか。つまり、process_uri() からの $tablePages へのアクセスは受け入れられるのでしょうか、それとも誤った結果が得られるのでしょうか。

エラーが発生する可能性がある場合は、修正または回避策を提案してください。

4

3 に答える 3

9

グローバル キーワードを使用します。

値を割り当てているファイル内。

global $tablePages;
$tablePages = 'orweb_pages';

そして、他のファイルでは:

class URIResolve {
  var $category;
  function process_uri() {
    global $tablePages;
    $this->category = $tablePages;
  }
}

また、すべてのグローバル変数は$GLOBALS配列 (それ自体がスーパーグローバル) で使用できるため、次のようにして global キーワードを使用せずにどこからでもグローバル変数にアクセスできます。

$my_value = $GLOBALS['tablePages'];

これは、グローバルの値を誤って上書きすることをより困難にするのにも役立ちます。前の例では、変更を加えると$tablePagesグローバル変数が変更されます。$userグローバルを持ち、それをより強力なユーザーの情報で上書きすることにより、多くのセキュリティ バグが作成されています。

別のさらに安全な方法は、URIResolve にコンストラクターで変数を提供することです。

class URIResolve {
  var $category;

  function __construct ($tablePages) {
    $this->category= $tablePages;
  }

  function process_uri() {
    // Now you can access table pages here as an variable instance
  }
}

// This would then be used as:
new URIResolve($tablePages);
于 2009-06-23T16:35:01.467 に答える
3

グローバル (非推奨)、定数、またはシングルトン構成クラスを使用します。

単に含む

$tablePages = 'orweb_pages';

変数にローカルスコープを与えるため、他のクラス内では表示されません。定数を使用する場合:

define('TABLE_PAGES', 'orweb_pages');

TABLE_PAGES は、スコープに関係なく、アプリケーション全体で読み取りアクセスに使用できます。

グローバル変数に対する定数の利点は、アプリケーションの他の領域でオーバーライドされることを心配する必要がないことです。

于 2009-06-23T16:40:33.433 に答える