簡體   English   中英

PHP參考歸還澄清

[英]PHP Return by Reference Clarification

我在這里有一個示例腳本,其中包含引用魔術__get的返回:

class a{

    public $_attributes = array();

    function &__get($k){
        if(isset($this->_attributes[$k])){
            return $this->_attributes[$k];
        }else{
            return null;
        }
    }

    function __set($k, $v){
        $this->_attributes[$k] = $v;
    }
}


$a = new a();
$a->username = "sam";
var_dump($a->username);
$u = $a->username;
$u = $u.'dddd';
var_dump($a->username);
var_dump($u);

從我的__get這里引用返回的想法是,我可以做類似的事情:

    $this->user->ins[session_id()] = array(
        "key"=>$_SESSION['server_key'],
        "ip"=>$_SERVER['REMOTE_ADDR'],
        "agent"=>$_SERVER['HTTP_USER_AGENT'],
        "last_request"=>$_SERVER['REQUEST_URI'],
        "last_active"=>new MongoDate(),
    );

因為我通常不能由於PHP使用原始數組的副本。 但是,當我說“用戶名”到新變量($ u)中時,我不希望它傳遞其原始父項的引用。

上面的腳本輸出:

string(3) "sam" string(3) "sam" string(7) "samdddd"

這很棒,因為它沒有將$ username作為參考傳遞回$ u,並且它的工作方式就像我想要的那樣。

現在該問問題了:這是一個好方法嗎? 這是PHP的預期行為嗎?

我一直在閱讀該頁面以進行引用,但是有點不完整,但是它確實提到要告訴PHP $ u應該是一個引用,在取出變量時也必須使用引用符號(如此處所示: http: //php.net/manual/en/language.references.return.php )。

那么,這是預期的行為嗎?我可以在PHP中依靠它嗎?還是我沒有看到可怕的東西?

謝謝

現在該問問題了:這是一個好方法嗎? 這是PHP的預期行為嗎?

這是一種不好的方法。 簡單地操縱對象,這是更常見的做法。 擁有它的方式很棘手,在開發過程中可能會誤導您。

如果決定繼續使用參考方法,則需要確保已通過參考獲得了該值。 請參閱以下示例:

$a = new a();
// returning by reference is not enough, you need to receive by ref as well
$u =& $a->username;

而不是通過引用返回數組,只需返回ArrayObject

class Foo
{
  private $data;

  public function __construct()
  {
    $this->data = new ArrayObject();
  }

  public function __get($key)
  {
    return $this->data;
  }
}

$foo = new Foo();
$foo->data['bar'] = 42;
var_dump($foo->data);

輸出:

object(ArrayObject)#2 (1) {
  ["storage":"ArrayObject":private]=>
  array(1) {
    ["bar"]=>
    int(42)
  }
}

不幸的是,PHP ArrayObject不能直接與PHP數組函數一起使用,但是我寧願上面的方法而不是總是通過引用返回__get

如果將標量裝在實現__toString()的對象中,則可以對標量執行類似的操作。 是的,這樣做也有缺陷,但是我總是不鼓勵使用__get引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM