【问题标题】:how to pass by reference a class var to a global var in PHP?如何通过引用将类 var 传递给 PHP 中的全局 var?
【发布时间】:2009-09-02 21:45:14
【问题描述】:

请告诉我有办法解决这个问题...

$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!'

谢谢!!

【问题讨论】:

  • 感谢erenon,问题是我已经尝试了注册表模式、单例等,这给了我最成功的结果。我需要的是一种进行更改或读取随处可用的 var 的方法,并且这会延续到对象内的 var。所以我的想法是让“无处不在”的变量成为对对象内部变量的引用。但这并没有发生。我知道我设置的引用工作正常,因为它几乎适用于所有情况,除非我尝试引用 var=to 另一个引用。 $everywhere_var -references-> $obj_var1 -refs-> $obj_var2

标签: php pass-by-reference


【解决方案1】:

这不正常。您应该在 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;
       }
    }
}

或者类似的东西,你可以添加错误处理、权限等。

【讨论】:

    【解决方案2】:

    在函数参数定义中的变量前面使用与号 (&amp;) 强制它通过引用传递。同样,在要分配给变量的值前面使用 & 号,以强制通过引用而不是按值进行分配。

    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

    【讨论】:

      【解决方案3】:

      $my_internal_var 是一个全局变量,而不是一个类变量,所以这行不可能工作:

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

      $this-&gt;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;
      }
      

      看看PHP manual page about variable scope

      哦,尽管这可能使它现在对您有用,但我支持erenon,因为您应该避免使用全局变量...

      【讨论】:

        猜你喜欢
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多