[英]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.