2009-06-23 17 views
3

は、次のような状況外変数へのアクセス

ファイルを考えてみましょう。 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へのアクセスを受け入れるか、それともエラーのある結果を出すかということです。

エラーが発生した場合は、訂正または回避策を提案してください。あなたが値を代入しているファイルでは

答えて

3

は定数またはシングルトンの構成クラス、(推奨されません)グローバルを使用してください。それは他のクラスの内側に表示されなくなりますので、単純に

$tablePages = 'orweb_pages'; 

含む

は、あなたのローカル変数のスコープを提供します。定数を使用する場合:

define('TABLE_PAGES', 'orweb_pages'); 

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

グローバル変数に対する定数の利点は、アプリケーションの他の領域でオーバーライドされる心配がありません。

+0

定数は完全なCapsである必要がありますか、または一般的な識別子の衝突を避けるためのプログラミング練習ですか? – OrangeRind

+0

ちょうど一般的な練習 – jcoffey

+0

は、クラス外で定義された関数についても真のスコープの問題ですか? – OrangeRind

9

global keywordを使用してください。

global $tablePages; 
$tablePages = 'orweb_pages'; 

そして、他のファイルに:

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

また、すべてのグローバル変数は、(自身がスーパーグローバルである)$GLOBALS配列で利用可能ですので、あなたが使用しなくてもどこでもグローバル変数にアクセスすることができます

$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); 
+0

ありがとうございます! 疑問:私は手動で$ GLOBALS ['tablePages'] = 'tablePages'を宣言しなければなりません。右? – OrangeRind

+0

私は最後のヒントがコンストラクタに渡すのが好きです。重要。いいぞ。 – andho

0
<?php 
//Use variable php : $GLOBALS in __construct 
$x = "Example variable outer class"; 

class ExampleClass{ 
    public $variables; 
    function __construct() 
    { 
    $this->variables = $GLOBALS; //get all variables from $GLOBALS 
    } 
    // example get value var 
    public function UseVar(){ 
    echo $this->variables['x']; // return Example variable outer class 
    } 
    // example set value var 
    public function setVar(){ 
    $this->variables['x'] = 100; 
    } 
} 
echo $x // return Example variable outer class; 

$Example = new ExampleClass(); 
$Example->UseVar(); // return Example variable outer class 
$Example->setVar(); // $x = 100; 

// or use attr variables 
echo $Example->variables['x']; // 100 
$Example->variables['x'] = "Hiii"; 
?> 
+0

一般的に、答えには コードの目的が説明されていると、はるかに有用です。 – Peter

関連する問題