Ссылается на переменную


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

function foo(&$var) {
   $var++;  
}
$a=5;
foo($a);
echo $a; // Retorna 6

Когда я увидел эту функцию, я подумал: "А разве, но если я сделаю звонок с нормальной return $var++ также будет работать...

function bar($var) {
   return $var++;
}
$b=5;
bar($b);
echo $b; // Retorna 5

я Не мог понять, очень хорошо, и поведение потому, что от первой функции, выполнять увеличение и второй функции нет.

Author: Wallace Maxters, 2016-01-14

4 answers

Проще говоря

В Этом первом случае, происходит следующим образом:

function bar($var) {
   $var++;
   return $var;
}
$b = 5;
echo bar( $b ); // Mostra 6 - valor do return
echo $b;        // Mostra 5 - valor do $b
  • atríbuido 5 $b.
  • вызове функции bar, переходя значение 5 к ней.
  • значение 5, сохраняется $var, увеличивается.
  • вы даете echo $b, который никогда не переставал быть 5.

, Посмотрите разницу. Я использовал одни и те же переменные, что и в предыдущем случае для упрощения:

function bar( &$var ) {
   $var++;
   return $var;
}
$b = 5;
echo bar( $b ); // Mostra 6 - valor do return
echo $b;        // Mostra 6 - valor do $b
  • atríbuido 5 $b.
  • вызове функции bar, переходя переменная $b для нее.
    (это происходит благодаря &, схватил достопримечательностей и не значение).
  • $b - же $var, увеличивается.
  • вы даете echo $b, который был увеличен в пределах bar
    (через "альтернативное имя" $var, который оказался имя $bв функции).

Короче говоря, в первом случае $var создается внутри функции значение 5. Во втором случае $var - $b с новым названием.


, Усложняя

Я изменил приведенные выше примеры, чтобы использовать одни и те же переменные, и гной прирост в отдельной строке, чтобы не впасть в замешательство:

function bar( &$var ) {
   return $var++;
}

$b = 5;
echo bar( $b ); // Mostra 5 - valor do return
echo $b;        // Mostra 6 - valor do $b

, Заметили что-то странное? Это то же самое, посмотрите на IDEONE.

Результат странный на первый echo не имеет ничего общего с ссылкой или нет, и да с того, что мы активизируем $var ПОСЛЕ return. Если бы это было ++$var, две линии показали 6.

Хотя это и не часть вопроса, я лучше комментировать, потому что, если функция вопроса была протестирована echo в свою очередь, может отрицательно сказаться на понимание.

Аннотация: в данном случае, мы провели $b функции. В функции возвращали $var, что $b вне функции, то есть 5. После return наносится ++, усилил $b (называется $var внутри функции).

 7
Author: Bacco, 2016-01-14 13:03:54

Прохождение ссылается на я считаю, что это одна из самых крутых вещей, которые есть в программировании.
Я считаю, что один из вопросов, которые вы должны сделать при изучении, это -:

  • Ссылается на что?

Memoria

Представьте, что когда вы программируете, и делает назначения переменную : $var = 5;, не просто присвоение 5 в переменную $var, это резервируя место в памяти компьютера, что тера как alias имя $var месте, и он будет иметь значение 5.

 0050 | 0051 | 0052 | 0053 | 0054 | 0055 | 0056     <-- possição da memoria
      |      | $var |      |      |      |          <-- alias
      |      |   5  |      |      |      |          <-- valor/referencia

Псевдоним, на самом деле является только бесплатным, чтобы содержимое possição 0052 памяти.

При создании прохода через ссылается вы dissendo, что содержание той possição памяти, не значение, а ссылка на место, что имеет значение. Это сложно, но было бы в основном так :

$b = &$var;

 0050 | 0051 | 0052 | 0053 | 0054 | 0055 | 0056     <-- possição da memoria
      |      | $var |      |  $b  |      |          <-- alias
      |      |   5  |      | 0052 |      |          <-- valor/referencia

Теперь, когда вы заходите $b eĺe не будет отображать 0052, потому что он ссылается на, он будет до ссылается и забрать его стоимость в случае 5.

Таким образом, если содержимое possição 0052 изменяется и $var $b будут изменить. Помните, что вы можете alteralo как $var $b.

$var = 7;

 0050 | 0051 | 0052 | 0053 | 0054 | 0055 | 0056     <-- possição da memoria
      |      | $var |      |  $b  |      |          <-- alias
      |      |   7  |      | 0052 |      |          <-- valor/referencia

$b = 10;

 0050 | 0051 | 0052 | 0053 | 0054 | 0055 | 0056     <-- possição da memoria
      |      | $var |      |  $b  |      |          <-- alias
      |      |  10  |      | 0052 |      |          <-- valor/referencia

Функция

При создании функции, переменные, которые вы создаете в качестве параметра создают possição в памяти, если они не имеют тип ссылки, ее ждут, чтобы получать значение, если имеют тип ссылки забрать ссылается в переменную прошедший.

function teste($a){

}

 0080 | 0081 | 0082 | 0083 | 0084 | 0085 | 0086     <-- possição da memoria
      |      | $a   |      |      |      |          <-- alias
      |      |      |      |      |      |          <-- valor/referencia

teste($var);

 0080 | 0081 | 0082 | 0083 | 0084 | 0085 | 0086     <-- possição da memoria
      |      |  $a  |      |      |      |          <-- alias
      |      |   5  |      |      |      |          <-- valor/referencia


function teste(&$a){

}

 0080 | 0081 | 0082 | 0083 | 0084 | 0085 | 0086     <-- possição da memoria
      |      | $a   |      |      |      |          <-- alias
      |      |      |      |      |      |          <-- valor/referencia

teste($var);

 0080 | 0081 | 0082 | 0083 | 0084 | 0085 | 0086     <-- possição da memoria
      |      |  $a  |      |      |      |          <-- alias
      |      | 0052 |      |      |      |          <-- valor/referencia

Так $a внутри функции изменяется расположение memoria 0052, изменив содержание, безусловно.

 4
Author: Guilherme Lautert, 2016-01-14 15:55:27

Функции, где параметры есть & означает, что вы должны передать переменную со значением просто не работает. Передача по ссылке означает, что переменная передается будет иметь свое значение изменяется по функции, если она будет разрушен внутри функции, и вы сделаете algumação действие в нем после выполнения, будет создано сообщение об ошибке.

function foo(&$var) {
   $var++;  
}
foo(5);//erro.

Прохождение аргумента по значению означает, что переменная или значение прошлом копируется функцию, и его "оригинал" будет продолжена без модификация.

Пример 1

function porReferencia(&$arg){
    $arg = 'modificado por referência';
}

$argOriginal = 'original';
referencia($argOriginal);
echo $argOriginal; //modificado por referência

Пример 2

function porValor($arg){
    $arg = 'modificado por valor';
    return $arg;
}

$arg = 'original';
porValor($arg);
echo $arg; //original

С некоторыми исключениями, функция должна изменять только те значения, которые передаются в качестве аргумента(копия) и его внутренних переменных, а не переменные вне ее масштабы(глобальные), изменения должны быть возвращены, поэтому не теряет первоначального содержимого, если это необходимо, использует его или сравнивает его, как в примере 2

И В другие языки, можно собрать интересный пример, где вы передать переменную или объект для функции/метода, и внутри него так же, в ссылку, после вызова пытается получить доступ к этой переменной и ошибки, в целом, заявив, что определить, что никогда не существовало.

 3
Author: rray, 2016-01-14 12:55:29

Мне потребовалось лет, чтобы понять, почему всегда я избегал использования, а также не понимает практического использования в реальных ситуациях. А также, что не проявил интерес.

, Я всегда видел примеры с параметрами в функции function foo(&$var) {, но я не понимала, почему использовать это, потому что я могу сделать, используя global и статические свойства класса.

Несколько лет назад, я видел пример использования очень разные и просто, используя array. То, что я проснулся интерес, чтобы использовать эту функцию параметров по ссылке.

Пример массива, который я видел, было что-то вроде этого:

    $arr = array(0 => 'a', 1 => 'b', 2 => 'c');

    print_r($arr);

    /*
Array
(
    [0] => a
    [1] => b
    [2] => c
)

    */

    $foo = &$arr[0];
    $foo = 'a modified';

    print_r($arr);

    /*
Array
(
    [0] => a modified
    [1] => b
    [2] => c
)

    */

Посмотрите, как $foo начинает действовать как ссылка или как ярлык (псевдоним) массива, который получил заявление.

Что-нибудь, что $foo появиться, будет "зеркальный" непосредственно в $arr[0].

Это упрощает обработку массивов многомерных.

Других различных целей, как отмечалось в других ответах.

Подумайте, Когда в назначений по ссылке, всегда представьте себе переменную "fake", где значение-это просто ссылку на адрес памяти, то есть, псевдоним (ярлык).

 1
Author: Daniel Omine, 2016-01-14 16:48:01