2011-12-23 1 views
1

Это моя установка:
display_startup_errors = на
display_errors = О
error_reporting = E_ALL | E_STRICT
Почему код ведет себя так, как обращается ссылка WRT?

$b; 
function func ($name) { 
    global $b; 
    $b = 10; 
    return $b; 
    } 
$a =& func("myname"); 
++$a ; 
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>"; 
xdebug_debug_zval('a'); echo "<br/> "; 

Приведенный выше код Выходов, следующее уведомление:

Строгие стандарты: только переменные должны быть назначены по ссылке в /path/to/file/file.php на линии «какой-то номер строки '
$ а = 11 $ Ь = 10
а: (RefCount = 1, is_ref = 0) = 11

Почему приведенный выше код не отображение лед? И почему происходит C.O.W (копия на запись)?

$b; 
function &func ($name) {//change here: to return a reference. 
    global $b; 
    $b = 10; 
    return $b; 
    } 
$a =& func("myname"); 
++$a ; 
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>"; 
xdebug_debug_zval('a'); echo "<br/> "; 

Приведенный выше код выведет:

$ а = 11 $ Ь = 11
а: (RefCount = 1, is_ref = 1) = 11

Почему здесь не упоминаются строгие стандарты? И здесь эта ссылка работает.

$b; 
function &func ($name) { 
    global $b; 
    $b = 10; 
    return $b; 
    } 
$a = func("myname"); //change here: removed & 
++$a ; 
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>"; 
xdebug_debug_zval('a'); echo "<br/> "; 

Приведенный выше код выведет:

$ а = 11 $ Ь = 10
а: (RefCount = 1, is_ref = 0) = 11

Почему здесь происходит COW?

Для получения информации о xdebug_debug_zval посетите here.

ответ

1

Как, черт возьми, я пропускаю это:.! Это полностью заглушает мой вопрос из Returning References на PHP ручной

Примечание: если вы попытаетесь вернуть ссылку из функции с синтаксисом: return ($ this-> value), это не будет работать, поскольку вы пытаетесь вернуть результат выражения, а не переменную, по ссылке. Вы можете возвращать переменные только по ссылке из функции - ничего больше. Поскольку PHP 4.4.0 в ветке PHP 4 и PHP 5.1.0 в ветке PHP 5, возникает ошибка E_NOTICE, если co de пытается вернуть динамическое выражение или результат нового оператора.

To use the returned reference, you must use reference assigment:

<?php 
function &collector() { 
    static $collection = array(); 
    return $collection; 
} 
$collection = &collector(); 
$collection[] = 'foo'; 
?> 
1

& Оператор в PHP в качестве ссылки удаляется в последних версиях. Специально от PHP5. Теперь все данные ссылочного типа (класс и т. Д.) Автоматически передаются по ссылке.

Читать Returning References и Passing by Reference

+0

Нет, она не передается по ссылке, если вы явно не определить. На вашей предоставленной ссылке вы можете видеть, что они используют оператор '&', поэтому он возвращается по ссылке. – Pradeep

+0

@ Pradeep Я разместил две ссылки. Вы видели первый? –

+0

@Shilpu Да, в первой ссылке вы видите, что они использовали оператор '&'. Они упомянули, что PHP пытается оптимизировать передаваемое возвращаемое значение, но это не изменит поведение. – Pradeep

1

Ваш второй фрагмент кода работает правильно.

В PHP, если вы хотите вернуться по ссылке, вам нужно также использовать оператор & в определении и при назначении. см. PHP reference Doc. Поэтому второй имеет правильный синтаксис и работает без предупреждения.

Первый фрагмент предупреждает, поскольку вы еще не определили, что эта функция будет возвращать ссылку, и все же вы назначаете ее возвращаемое значение по ссылке. Таким образом, это не сработает. (см. значение a значение увеличивается до 11, но b - только 10.)

В третьем фрагменте вы не назначаете ссылку, чтобы не давать никаких предупреждений. (Но из-за этой ссылки не работают будет (см разницы в a-х и b 'значение s)