PHP「&」演算子

php
PHP「&」演算子

私はPHPプログラマーではありませんが(他の言語は知っています)、PHP(5.1.6)で変更を加えるために行われたWebページを理解しようとしています。

このページには次のコードがあります(簡略化されています)。

$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およびhttps://stackoverflow.com/questions/600202/understanding-phps-operator[this]が見つかりました。しかし、これらのリンクでは演算子が「=&」であり、コードでは演算子が変数「=&$ db_hosts」に接続されているため(=と&の間にスペースがあります)、私はよくわかりません。

変更しようとして成功しなかったので、助けを求める方が良いと思いました…​

  20  3


ベストアンサー

これらは参照であり、CまたはC ++の「ポインター」に似ています。

詳細については、http://www.php.net/manual/en/language.oop5.references.php [PHPマニュアル]を参照してください。

この場合、 $ db_hosts`は空であるため、コンストラクト $ db_hosts [$ db_item [‘hostid’]] は、 $ db_item [‘hostid’] `のインデックスに空の項目を持つ新しい配列を作成し、アイテムの参照を返し、現在の「$ db_hosts [$ db_item [‘hostid’]]」が何であれ、「$ db_host」を「エイリアス」として機能させます。

28


&`は、参照(http://php.net/manual/en/language.references.php [このマニュアルのセクションを参照])を示すためにPHPでさまざまに使用されますが、それを演算子であると考えるのは誤解を招きますそれ自身の権利。 これが、一部の人々が `$ foo =&$ bar`ではなく $ foo =&$ bar`を書くことを好む理由です-これは同じことを意味しますが、「reference-y-ness」は割り当てのプロパティであることを強調します、変数ではありません。

CやC ++などの一部のプログラミング言語では、特定の変数への「参照を取得」できます。結果の値は別個のエンティティとして渡され、「参照解除」されて、それが指す場所を見つけます。 これはPHPの参照とは異なります。

代わりに、all PHP変数は、実際には zval`と呼ばれる内部型への参照です。 PHPで `zval`を直接操作することも、間接的なレイヤーを追加することもできません。すべての変数は zval`への参照であり、それだけです。 (注意:下のオブジェクトを参照してください。)

参照による割り当て( $ foo =&$ bar)、参照による受け渡し(` function foo(&$ bar){…​ } )、またはreturn-by-reference( return&$ foo`)doは、2つの変数が同じ `zval`を指すようにPHPに指示します。 ある変数を別の変数で「指している」わけではないことに注意してください-どちらも等しく「本物」であり、どちらかで `unset()`を呼び出すと、もう一方は完全に触れられません。

注意:オブジェクト

PHP5オブジェクトは「常に参照によって渡される」ため、誤解を招くように言われます。 真実は、それらが間接の* extra *レイヤーを持っているということです。そこでは、 `zval`はそれ自体が特定のオブジェクトへのポインターです。 これにより、参照できる3つの異なるものが得られます:variable、それが指す「zval」、およびそれが指す_object_:

// 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);

11


質問

なに」

* 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);

したがって、上記のすべての背後には、ビットごとの演算子とビットのゲームがあります。

これらの便利な例の1つは、以下のような簡単な構成です。そのため、1つの整数フィールドに数千のコンボを保存できます。

ほとんどの人はすでにドキュメントを読んでいますが、これらのビットごとの演算子の実際の使用例に依存していません。

例それは非常に便利な日常のphpライフです。

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

8


その変数を参照として割り当てると、後で$ db_hostが変更された場合、$ db_hosts配列内の対応するエントリも変更され、その逆も同様です。

私は、カーゴカルトスタイルのPHPで、かなり無意味なリファレンスの使用を見てきました。 おそらく、これはおそらく必要ではありません-あなたはプログラムの残りを見る必要があります。

4


_
PHPでの参照は、同じ変数コンテンツに異なる名前でアクセスする手段です。 Cポインターとは異なります。たとえば、それらを使用してポインタ演算を実行することはできません。それらは実際のメモリアドレスではありません。
_

3


3


&は、変数への参照を取得するために使用されます。 C ++のような他の言語の参照に似ていますが、いくつかの大きな違いがあります。 http://php.net/manual/en/language.references.php [リファレンスに関するPHPマニュアルのセクション]を参照してください。

2


タイトルとURLをコピーしました