Подтвердить что ты не робот

Что означает & перед именем функции?

Что означает & перед именем функции?

Означает ли это, что $result возвращается ссылкой, а не значением? Если да, то это правильно? Насколько я помню, вы не можете вернуть ссылку на локальную переменную, поскольку она исчезает после выхода функции.

function &query($sql) {
 // ...
 $result = mysql_query($sql);
 return $result;
}

Также, где этот синтаксис используется в практике?

4b9b3361

Ответ 1

Означает ли это, что $result возвращается по ссылке, а не по значению?

Да.

Также, где этот синтаксис используется в практике?

Это более распространено в сценариях PHP 4, где по умолчанию объекты были переданы по значению.

Ответ 2

Чтобы ответить на вторую часть вашего вопроса, здесь место, где я должен был использовать его: Magic getters!

class FooBar {
    private $properties = array();

    public function &__get($name) {
        return $this->properties[$name];
    }

     public function __set($name, $value) {
        $this->properties[$name] = $value;
    }
}

Если бы я не использовал &, это было бы невозможно:

$foobar = new FooBar;
$foobar->subArray = array();
$foobar->subArray['FooBar'] = 'Hallo World!';

Вместо этого PHP выкинул бы ошибку, говоря что-то вроде "не может косвенно модифицировать перегруженное свойство".

Хорошо, это, вероятно, только хак, чтобы обойти некоторые maldesign в PHP, но он по-прежнему полезен.

Но, честно говоря, я не могу сейчас думать о другом примере. Но я уверен, что есть некоторые редкие случаи использования...

Ответ 3

Означает ли это, что $result возвращается по ссылке, а не по значению?

Нет. Разница в том, что он может возвращаться по ссылке. Например:

<?php
function &a(&$c) {
    return $c;
}
$c = 1;
$d = a($c);
$d++;
echo $c; //echoes 1, not 2!

Чтобы вернуться по ссылке, вам нужно будет:

<?php
function &a(&$c) {
    return $c;
}
$c = 1;
$d = &a($c);
$d++;
echo $c; //echoes 2

Также, где этот синтаксис используется в практике?

На практике вы используете каждый раз, когда хотите, чтобы вызывающая функция вашей функции манипулировала данными, которыми владеет вызываемый, не сообщив ему. Это редко используется, потому что это нарушение инкапсуляции - вы можете установить возвращаемую ссылку на любое значение, которое вы хотите; вызываемый не сможет проверить его.

nikic дает отличный пример того, когда это используется на практике.

Ответ 4

  <?php
    // You may have wondered how a PHP function defined as below behaves:
    function &config_byref()
    {
        static $var = "hello";
        return $var;
    }
    // the value we get is "hello"
    $byref_initial = config_byref();
    // let change the value
    $byref_initial = "world";
    // Let get the value again and see
    echo "Byref, new value: " . config_byref() . "\n"; // We still get "hello"
    // However, lets make a small change:
    // Weve added an ampersand to the function call as well. In this case, the function returns "world", which is the new value.
    // the value we get is "hello"
    $byref_initial = &config_byref();
    // let change the value
    $byref_initial = "world";
    // Let get the value again and see
    echo "Byref, new value: " . config_byref() . "\n"; // We now get "world"
    // If you define the function without the ampersand, like follows:
    // function config_byref()
    // {
    //     static $var = "hello";
    //     return $var;
    // }
    // Then both the test cases that we had previously would return "hello", regardless of whether you put ampersand in the function call or not.