1

これを回避する方法を教えてください...

$my_var = 'hello';

class Test{

    private $my_var;
    private $my_internal_var = 'if you see this it works!';

    function __construct(){
        global $my_var;

        $this->my_var = &$my_var;
    }

    function get_my_var(){
        return $this->my_var;
    }

    function set_my_var($value){
        $this->my_var = $value;
    }

    function set_my_var_to_internal_reference(){
        //this line should make $my_var in root, $my_var in this object, and $my_var in
        //all external functions point to $my_internal_var.
        $this->my_var = &$this->my_internal_var;
    }
}


function get_my_var(){
    global $my_var;

    return $my_var;
}

function set_my_var($value){
    global $my_var;

    $my_var = $value;
}


$my_obj = new Test();

echo '<h2>set default starting value</h2>';
echo 'obj : '.$my_obj->get_my_var().'<br>'; //echoes 'hello' - this is ok
echo 'func: '.get_my_var().'<br>'; //echoes 'hello' - this is ok
echo 'root: '.$my_var.'<br>'; //echoes 'hello' - this is ok

set_my_var('hello world!');

echo '<h2>set to value by function</h2>';
echo 'obj : '.$my_obj->get_my_var().'<br>'; //echoes 'hello world!' - this is ok
echo 'func: '.get_my_var().'<br>'; //echoes 'hello world!' - this is ok
echo 'root: '.$my_var.'<br>'; //echoes 'hello world!' - this is ok

$my_obj->set_my_var('hello world again!');

echo '<h2>set to value by object method</h2>';
echo 'obj : '.$my_obj->get_my_var().'<br>'; //echoes 'hello world again!' - this is ok
echo 'func: '.get_my_var().'<br>'; //echoes 'hello world again!' - this is ok
echo 'root: '.$my_var.'<br>'; //echoes 'hello world again!' - this is ok

$my_obj->set_my_var_to_internal_reference();

echo '<h2>set to object internal reference</h2>';
echo 'obj : '.$my_obj->get_my_var().'<br>'; //echoes '      ' - this is NOT ok. should be 'if you see this it works!'
echo 'func: '.get_my_var().'<br>'; //echoes 'hello world again!' - this is NOT ok. should be 'if you see this it works!'
echo 'root: '.$my_var.'<br>'; //echoes 'hello world again!' - this is NOT ok. should be 'if you see this it works!'

ありがとう!!

4

3 に答える 3

2

このままではダメです。OO環境ではラッパーオブジェクトを使用する必要があり、グローバル変数は使用しないでください。それらは最悪です。

class My_Registry{
    private $registry = array();

    public function set_var($key, $var){
        $this->registry[$key] = $var;
        return $this;
    }

    public function get_var($key){
       if(isset($this->registry[$key]){
           return $this->registry[$key]
       }else{
           return false;
       }
    }
}

または、このようなもので、エラー処理、権限などを追加できます。

于 2009-09-02T21:52:36.280 に答える
0

関数の引数の定義で変数の前にアンパサンド ( &) を使用して、参照渡しを強制します。同様に、変数に割り当てる値の前にアンパサンドを使用して、値ではなく参照による割り当てを強制します。

function foo(&$var)
{
    // $var is passed by reference to this function
}

$var = $var2;  // assigns $var the value of $var2
$var = &$var2; // assigns $var the same reference as $var2

詳細については、PHP マニュアルのセクションReferences Explainedを参照してください。

于 2009-09-02T21:48:37.740 に答える
0

$my_internal_varはグローバル変数であり、クラス変数ではないため、次の行は機能しない可能性があります。

$this->my_var = &$this->my_internal_var;

$this->my_internal_var存在しません。

他の関数/メソッドで既に使用しているのと同じロジックを使用しないのはなぜですか? $GLOBALSただし、あるグローバル変数を別のグローバル変数の参照に設定するには、配列を使用する必要があります。

function set_my_var_to_internal_reference(){
    global $my_internal_var;

    $this->my_var = &$my_internal_var;
    $GLOBALS['my_var'] = &$my_internal_var;
}

variable scope に関する PHP マニュアル ページを参照してください。

ああ、これでうまくいくかもしれませんが、グローバルの使用を避けるべきであるという点で、私はエレノンと一緒です...

于 2009-09-02T22:13:17.207 に答える