[英]PHP “&” operator
我不是 PHP 程序員(但知道其他語言),我試圖理解用 PHP (5.1.6) 完成的網頁,以便進行一些更改。
該頁面具有以下代碼(簡化):
$db_hosts = array();
$sql = 'SELECT h.hostid, h.host FROM hosts h ';
$db_items = DBselect($sql);
while($db_item = DBfetch($db_items)){
$name = $db_item['host'];
$db_host = &$db_hosts[$db_item['hostid']];
}
我試圖理解最后一行, $db_host = &$db_hosts[$db_item['hostid']];
.
它似乎正在創建一個新變量$db_host
,並在其中放入一些東西,但我不明白&$db_hosts
。
我有疑問,因為據我所知, $db_hosts
是一個空數組。
我找到了this和this ,但我不太確定,因為在這些鏈接中,運算符是“=&”,而在代碼中,運算符附加到變量“= &$db_hosts”(它有一個空格= 和 & 之間)。
既然我嘗試修改了沒有成功,我覺得還是求助一下比較好……
這些是引用,它們類似於 C 或 C++ 中的“指針”。
更多信息在PHP 手冊中。
在這種情況下,由於$db_hosts
是空的,構造$db_hosts[$db_item['hostid']]
將創建一個新數組,其中$db_item['hostid']
的索引上有一個空項目,並返回項目的引用,使$db_host
充當當前$db_hosts[$db_item['hostid']]
的“別名”。
&
在 PHP 中以多種方式用於表示引用(請參閱本手冊部分),但將其視為本身的運算符是一種誤導。 這就是為什么有些人更喜歡寫$foo =& $bar
而不是$foo = &$bar
- 這意味着同樣的事情,但強調“reference-y-ness”是賦值的屬性,而不是賦值的屬性變量。
在某些編程語言中,例如 C 或 C++,您可以“獲得對特定變量的引用”; 結果值可以作為一個不同的實體傳遞,然后“取消引用”以找出它指向的位置。 這不是PHP 引用。
相反,所有PHP 變量實際上都是對稱為zval
的內部類型的引用。 您不能在 PHP 中直接操作zval
,也不能進行額外的間接層 - 每個變量都是對zval
的引用,僅此而已。 (請參閱警告:下面的對象。)
什么是引用賦值( $foo =& $bar
)、引用傳遞( function foo(&$bar) { ... }
)或引用return &$foo
( return &$foo
)做的是告訴 PHP 您希望兩個變量指向同一個zval
。 請注意,您並沒有將一個變量“指向”另一個變量——它們都同樣“真實”,並且對其中一個調用unset()
將使另一個完全保持不變。
警告:對象
由於 PHP5 對象“總是通過引用傳遞”,因此經常被誤導。 事實上,它們有一個額外的間接層,其中zval
本身就是一個指向特定對象的指針。 這給了我們三個可以引用的不同的東西:變量、它指向的zval
它指向的對象:
// Create an object, and point three variables at it in different ways:
$foo = new stdClass;
$bar_by_value = $foo;
$bar_by_ref =& $foo;
// Change the object: updates the object shared by all three variables
$foo->value = 42;
// Change the value (zval) of $foo: will update $bar_by_ref,
// but $bar_by_value still points at the original object
$foo = 42;
// Change the variable itself: will never affect $bar_by_value or $bar_by_ref
unset($foo);
問題:
PHP中的“&”是什么意思?
一旦我們習慣了它會讓生活更輕松..(仔細檢查下面的例子)
&通常檢查在 $a 和 $b 中設置的位是否設置。
你有沒有注意到這些調用是如何工作的?
error_reporting(E_ERROR | E_WARNING | E_PARSE);
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
error_reporting(E_ALL & ~E_NOTICE);
error_reporting(E_ALL);
因此,以上所有內容的背后是按位運算符和位的游戲。
其中一個有用的例子是簡單的配置,例如下面給出的,因此單個整數字段可以為您存儲數千個組合。
大多數人已經閱讀了文檔,但沒有依賴這些按位運算符的實際用例。
<?php
class Config {
// our constants must be 1,2,4,8,16,32,64 ....so on
const TYPE_CAT=1;
const TYPE_DOG=2;
const TYPE_LION=4;
const TYPE_RAT=8;
const TYPE_BIRD=16;
const TYPE_ALL=31;
private $config;
public function __construct($config){
$this->config=$config;
if($this->is(Config::TYPE_CAT)){
echo 'cat ';
}
if($this->is(Config::TYPE_DOG)){
echo 'dog ';
}
if($this->is(Config::TYPE_RAT)){
echo 'rat ';
}
if($this->is(Config::TYPE_LION)){
echo 'lion ';
}
if($this->is(Config::TYPE_BIRD)){
echo 'bird ';
}
echo "\n";
}
private function is($value){
return $this->config & $value;
}
}
new Config(Config::TYPE_ALL);
// cat dog rat lion bird
new Config(Config::TYPE_BIRD);
//bird
new Config(Config::TYPE_BIRD | Config::TYPE_DOG);
//dog bird
new Config(Config::TYPE_ALL & ~Config::TYPE_DOG & ~Config::TYPE_CAT);
//rat lion bird
&
通過引用賦值。
將該變量分配為引用使得如果稍后 $db_host 發生更改,則 $db_hosts 數組中的相應條目也將更改,反之亦然。
我在 PHP 中看到了相當無意義的引用,貨物崇拜風格。 也許需要這個,也許不需要——您必須查看程序的其余部分。
&
用作參考。 查看http://php.net/manual/en/language.references.php 中的引用:
PHP 中的引用是一種通過不同名稱訪問相同變量內容的方法。 它們不像 C 指針; 例如,您不能使用它們執行指針運算,它們不是實際的內存地址,等等。
& 用於獲取對變量的引用。 它類似於 C++ 等其他語言中的引用,但有一些顯着差異。 請參閱PHP 手冊的參考部分。
下面是一個簡單的例子來解釋 PHP &
運算符的含義:
<?php
$x = "Hello";
$y = &$x;
echo "Value of x : " . $x . "\n";
echo "Value of y : " . $y . "\n";
$y = "Hi"; // Since $y is alias or reference of the variable $x, so value of $x will also be changed, see below:
echo "Value of x : " . $x . "\n";
echo "Value of y : " . $y . "\n";
上述代碼的輸出如下:
Value of x : Hello
Value of y : Hello
Value of x : Hi
Value of y : Hi
從上面的例子可以看出,它是變量的引用。
來自官方文檔: 參考文獻是什么
PHP 中的引用是一種通過不同名稱訪問相同變量內容的方法。 它們不像 C 指針; 例如,您不能使用它們執行指針運算,它們不是實際的內存地址,等等。 有關更多信息,請參閱引用不是什么。 相反,它們是符號表別名。 注意在PHP中,變量名和變量內容是不同的,所以相同的內容可以有不同的名字。 最接近的類比是 Unix 文件名和文件——變量名是目錄條目,而變量內容是文件本身。 引用可以比作 Unix 文件系統中的硬鏈接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.