簡體   English   中英

PHP“&”運算符

[英]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是一個空數組。

我找到了thisthis ,但我不太確定,因為在這些鏈接中,運算符是“=&”,而在代碼中,運算符附加到變量“= &$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 &$fooreturn &$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中的“&”是什么意思?

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 日常生活非常有用

<?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.

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