Intereting Posts
как передать URL-адрес переменной на следующие страницы в разбивке на страницы php Можно ли полагаться на IP-адрес Paypal исключительно для регистрации покупок? PHP-сессии Cookies перестали работать на моем сервере ТОЛЬКО Как хранить ежедневные записи из таблицы mysql в другую? Обнаружение, если PCRE был создан без параметров –enable-unicode или -enable-utf8 Open Grammar Checker php xpath с текстом () и SimpleXMLElement-> xpath не соответствует ожидаемым результатам xpath Android: как сделать мой извлеченный (из mysql) анализируемые данные JSON, добавленные в ListView, обновить его каждую минуту База данных PostgreSQL – ошибка внутреннего входящего запроса CakePHP 3 defaultConnectionName в модели плагина не работает Проверка подлинности для конкретного домена Имена таблиц, чувствительных к mysql в запросах : Есть ли способ сохранить текст в формате Rich Text в таблице MySQL? Индикатор выполнения загрузки файла Проверьте, заблокирован ли Facebook, а затем перенаправляет

Описательное поведение отдельных элементов отделено от ссылочного статуса контейнера массива?

Что это значит? Другими словами, ссылочное поведение массивов определяется поэтапным принципом: эталонное поведение отдельных элементов отделено от ссылочного статуса контейнера массива ».

Как отдельные элементы отделены от ссылочного статуса контейнера массива? Я собирался провести тщательный док, и я смущен, что это значит?

<?php /* Assignment of scalar variables */ $a = 1; $b =& $a; $c = $b; $c = 7; //$c is not a reference; no change to $a or $b /* Assignment of array variables */ $arr = array(1); $a =& $arr[0]; //$a and $arr[0] are in the same reference set $arr2 = $arr; //not an assignment-by-reference! $arr2[0]++; /* $a == 2, $arr == array(2) */ /* The contents of $arr are changed even though it's not a reference! */ ?> 

Solutions Collecting From Web of "Описательное поведение отдельных элементов отделено от ссылочного статуса контейнера массива?"

Я думаю, что если вы используете какое-то искусство ASCII, вы можете это понять лучше:

Первый пример:

 //Line 01 $a = 1; ---------- ┌──────┐ ┌─────┐ │ $a │ ─────────────────> │ 1 │ └──────┘ └─────┘ 

 //Line 02 $b = &$a; ---------- ┌──────┐ ┌─────┐ │ $a │ ─────────────────> │ 1 │ └──────┘ └─────┘ ^ ┌──────┐ │ │ $b │ ───────────────────────┘ └──────┘ 

 //Line 03 $c = $b; ---------- ┌──────┐ ┌─────┐ │ $a │ ─────────────────> │ 1 │ └──────┘ └─────┘ ^ ┌──────┐ │ │ $b │ ───────────────────────┘ └──────┘ ┌──────┐ ┌─────┐ │ $c │ ─────────────────> │ 1 │ └──────┘ └─────┘ 

 //Line 04 $c = 7; ---------- ┌──────┐ ┌─────┐ │ $a │ ─────────────────> │ 1 │ └──────┘ └─────┘ ^ ┌──────┐ │ │ $b │ ───────────────────────┘ └──────┘ ┌──────┐ ┌─────┐ │ $c │ ─────────────────> │ 7 │ └──────┘ └─────┘ 

Теперь, как вы можете видеть, когда вы назначаете переменную по ссылке и вы ее изменяете, она также изменит значение для другой переменной. Здесь, например, $a и $b , если вы назначаете от 5 до $b , $a также укажет на 5, наоборот.

Но вы не назначили $b для $c по ссылке (вы сделали нормальное присвоение значения), поэтому, если вы измените значение $c оно не изменит значение $b (, или $a ).

Второй пример:

 //Line 01 $arr = array(1); ---------- ┌───────────┐ ┌─────┐ │ $arr[0] │ ─────────────────> │ 1 │ └───────────┘ └─────┘ 

 //Line 02 $a = &$arr[0]; ---------- ┌───────────┐ ┌─────┐ │ $arr[0] │ ─────────────────> │ 1 │ └───────────┘ └─────┘ ^ ┌──────┐ │ │ $a │ ────────────────────────────┘ └──────┘ 

  // Линия 03
 $ arr2 = $ arr;

 ----------

 ┌────────────────────────────────────────┐      
 │ $ arr [0] │ ──────────────────────────────────────────│
 └────────────────────────────────────────┘
                                        ^
 ┌──────┐ │
 │ $ a │ ────────────────────────────────────────────────────────────────┤ 
 └──────┘ │
                                        │
 ┌────────────┐ │
 │ $ arr2 [0] │ ─────────────────────────────────────────────────────┘
 └────────────┘                       

 //Line 04 $arr2[0]++; ---------- ┌───────────┐ ┌─────┐ │ $arr[0] │ ─────────────────> │ 2 │ └───────────┘ └─────┘ ^ ┌──────┐ │ │ $a │ ────────────────────────────┤ └──────┘ │ │ ┌────────────┐ │ │ $arr2[0] │ ──────────────────────┘ └────────────┘ 

Теперь идет строка, которую руководство пытается объяснить:

 $arr2 = $arr; 

Даже если вы не присваиваете массив $arr ссылкой на $arr2 , массив все еще содержит элемент, который указывает на ссылку! И эта ссылка все равно будет в $arr2 , поэтому первый элемент второго массива также указывает на ссылку как $arr[0] и $a .


Возможно, если вы видите разницу, когда массив присваивается ссылкой, и когда массив содержит элемент со ссылкой, вы понимаете это лучше:

Массив, назначенный по ссылке:

 //Line 01 $arr1 = [1, 1, 1]; ---------- ┌─────────┐ │ $arr1 │ └─────────┘ │ │ └─────────> ┌────────────┐ │ Array │ ┌─────┐ │ container: │ ┌───> │ 1 │ ├────────────┤ │ └─────┘ │ [0] │ ───┘ ├────────────┤ ┌─────┐ │ [1] │ ───────> │ 1 │ ├────────────┤ └─────┘ │ [2] │ ───┐ └────────────┘ │ ┌─────┐ └───> │ 1 │ └─────┘ 

  // Строка 02
 $ arr2 = & $ arr1;

 ----------

 ┌─────────┐                            
 │ $ arr1 │         
 └─────────┘                       
      │
      │
      └────────────────────────────────────────────────┐
                  │ Массив │ ┌──────┐  
                  │ контейнер: │ ┌───> │ 1 │
                  ->
                  │ [0] │ ───┘
                  ├───────────────────────────────────────────┐  
                  │ [1] │ ────────> │ 1 │
                  ├───────────────────────────────────────────┘
                  │ [2] │ ───┐
      ┌─────────────────────────────────────────────────────────────────────┐ ┌ 
      │ └───> │ 1 │
      │ └──────┘
 ┌─────────┐                            
 │ $ arr2 │         
 └─────────┘   

 //Line 03 & 04 $arr2[0] = 2; $arr2[1] = 2; ---------- ┌─────────┐ │ $arr1 │ └─────────┘ │ │ └─────────> ┌────────────┐ │ Array │ ┌─────┐ │ container: │ ┌───> │ 2 │ ├────────────┤ │ └─────┘ │ [0] │ ───┘ ├────────────┤ ┌─────┐ │ [1] │ ───────> │ 2 │ ├────────────┤ └─────┘ │ [2] │ ───┐ ┌─────────> └────────────┘ │ ┌─────┐ │ └───> │ 1 │ │ └─────┘ ┌─────────┐ │ $arr2 │ └─────────┘ 

Итак, как вы можете видеть здесь, поскольку вы назначили $arr1 на $arr2 по ссылке, они оба указывают на тот же массив.

Массив, содержащий ссылку:

 //Line 01 $a = 1; ---------- ┌──────┐ ┌─────┐ │ $a │ ─────────────────> │ 1 │ └──────┘ └─────┘ 

  // Строка 02
 $ arr3 = [ & $ a , 1, 1];

 ----------

 ┌──────┐ ┌──────┐      
 │ $ a │ ───────────────────────────────────────────────────│
 └──────┘ └──────┘            
                                    ^              
 ┌─────────┐ │              
 │ $ arr3 │ │              
 └─────────┘ │              
      │ │              
      │ │              
      └─────────────────────────────────────>              
                  │ Массив │ │              
                  │ контейнер: │ │              
                  ├────────────┤ │              
                  │ [0] │ ───┘              
                  ├───────────────────────────────────────────┐  
                  │ [1] │ ────────> │ 1 │  
                  ├───────────────────────────────────────────┘  
                  │ [2] │ ───┐              
                  ->  
                                    └───> │ 1 │  
                                          └─────┘  




  // Линия 03
 $ arr4 = $ arr3;

 ----------

 ┌──────┐ ┌──────┐      
 │ $ a │ ─────────────────────────────────────────────────> │ 1 │
 └──────┘ └─────┘ │ 
                                    ^ │
 ┌──────────┐ │ │
 │ $ arr3 │ │ │
 └──────────┘ │ │
      │ │ │
      │ │ │
      └──────────────────────────────────────────────────────────>
                  │ Массив │ │ │
                  │ контейнер: │ │ │
                  ├──────────────┤ │ │
                  │ [0] │ ───┘ │
                  ├───────────────────────────────────────────────│
                  │ [1] │ ───────> │ 1 │ │
                  ├───────────────────────────────────────────────│
                  │ [2] │ ───┐ │
                  └───────────┘ │ ┌──────
                                    └───> │ 1 │ │
                                          └─────┘ │
                                                   │
 ┌─────────┐ │
 │ $ arr4 │ │
 └─────────┘ │
      │ │
      │ │
      └─────────────────────────────────────>
                  │ Массив │ │
                  │ контейнер: │ │
                  ├────────────┤ │
                  │ [0] │ ───────────────────────────────────────────┘
                  ├───────────────────────────────────────────┐  
                  │ [1] │ ────────> │ 1 │
                  ├───────────────────────────────────────────┘
                  │ [2] │ ───┐
                  -> 
                                    └───> │ 1 │
                                          └─────┘



 //Line 03 & 04 $arr4[0] = 2; $arr4[1] = 2; ---------- ┌──────┐ ┌─────┐ │ $a │ ──────────────────> │ 2 │ <─────────┐ └──────┘ └─────┘ │ ^ │ ┌─────────┐ │ │ │ $arr3 │ │ │ └─────────┘ │ │ │ │ │ │ │ │ └─────────> ┌────────────┐ │ │ │ Array │ │ │ │ container: │ │ │ ├────────────┤ │ │ │ [0] │ ───┘ │ ├────────────┤ ┌─────┐ │ │ [1] │ ───────> │ 1 │ │ ├────────────┤ └─────┘ │ │ [2] │ ───┐ │ └────────────┘ │ ┌─────┐ │ └───> │ 1 │ │ └─────┘ │ │ ┌─────────┐ │ │ $arr4 │ │ └─────────┘ │ │ │ │ │ └─────────> ┌────────────┐ │ │ Array │ │ │ container: │ │ ├────────────┤ │ │ [0] │ ──────────────────┘ ├────────────┤ ┌─────┐ │ [1] │ ───────> │ 2 │ ├────────────┤ └─────┘ │ [2] │ ───┐ └────────────┘ │ ┌─────┐ └───> │ 1 │ └─────┘ 

Таким образом, вы можете видеть здесь, даже если вы назначили $arr3 до $arr4 по стоимости, а не по ссылке! Массив все еще содержит эту ссылку, которая делится с $a и $arr3[0] .