Предупреждение о передаче массива по ссылке

Nicki

Новичок
Предупреждение о передаче массива по ссылке

Привет.
Вот при передаче массива по ссылке выскакивает

Strict Standards: Only variables should be assigned by reference in ...

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

kvf77

Red Devil
Nicki
Потому что массивы с 5 версии ВСЕГДА передаются по ссылке автоматом
 

berkut

Новичок
function a(&$v)
{}
a('str');
вот и ошибка.
kvf77 а где первоисточник??

-~{}~ 19.05.08 16:08:

прогнал kvf77
$a = array(1, 2, 3);
function test($v)
{
$v[0] = 77;
}
test($a);
var_dump($a);
 

dimagolov

Новичок
berkut, прогнал ты. Они передаются по ссылке, но если ты меняешь что-то в ф-ии, то далается копия.
ошибка если так:
PHP:
function f($a) {
}
$a= array(1,2,3);
$b=f(&$a);
// так правильно:
function g(&$a) {
}
$b=f($a);
 

berkut

Новичок
dimagolov чуваг, ты не вминяем.
Потому что массивы с 5 версии ВСЕГДА передаются по ссылке автоматом
copyOnWrite было ещё за долго до пятёрки.
а такое не выдаёт ошибки?
function a(&$v)
{}
a('str');
чо за чудило
 

MiksIr

miksir@home:~$
Автор оригинала: dimagolov
berkut, прогнал ты. Они передаются по ссылке, но если ты меняешь что-то в ф-ии, то далается копия.
это логично, но явно не повод делать strict если руками по ссылке передавать

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

berkut

Новичок
cDLEON ёкарный бабай. ты запусти этот код и посмотри что топикстартер пишет. чё за
function a(&$v)
{}
a(array(1));
 

Nicki

Новичок
Я наверное не очень уточнил - мне нужно получить ссылку, а не передать. В общем... у меня вот какая беда тут получается. По сути есть класс реестр.
PHP:
class Registry 
{
private $_vars;

function assign_by_ref($name, &$value) {
    $this->_vars[$name] =& $value;
}

function &get_by_ref($name) {
    if (isset($this->_vars[$name]))
        return $this->_vars[$name];
    else return false;
}
}
У меня не стоял амперсанд & перед именем метода get_by_ref() в его объявлении в классе. Поэтому во-первых при вызове $linkFromFunc =& $Registry->get_by_ref('arrayName'); вываливался именно Strict Standards: в месте вызова метода получения ссылки на массив, а во-вторых, и сама ссылка конечно не передавалась - моя ошибка, признаю :). Сейчас я исправил метод добавив амперсанд, и теперь Стрикс поменялся на Notice: с тем же текстом описания ошибки "Notice: Only variable references should be returned by reference in...". А возникант нотис только в строке возврата из метода get_by_ref(). Ссылка конечно передается, работает правильно... но вот это сообщение, как с ним быть? Просто хочется чтобы и нотисов не выводил скрипт...

-~{}~ 19.05.08 18:13:

Автор оригинала: MiksIr
могу потелепатить, что топикстартер пытается по ссылке принять результат функции, которая не объявлена как отдающая по ссылке.. или что-то вроде этого.
В принципе ты был прав! Так оно и было фактически... накосячил я с этим чуть. Но поправил. Теперь вместо стрикта выскакиввает нотис...
 

surg30n

Новичок
Автор оригинала: Nicki
function &get_by_ref($name) {
if (isset($this->_vars[$name]))
return $this->_vars[$name];
else return false;
}
PHP:
function &get_by_ref($name) {
$result = false;    
if (isset($this->_vars[$name]))
        return $this->_vars[$name];
    else return $result;
}
 

Nicki

Новичок
Хммм... да уж. Все гениальное - просто! Спасибо, теперь буду знать :))
 

iSlayter

Новичок
так почему нотис-то был никто не скажет? и почему при таком изменении функции он исчез? спасибо.
 

dimagolov

Новичок
потому что не может быть ссылки на константу, а на переменную может
 

HraKK

Мудак
Команда форума
kvf77
Передаются по ссылке всегда только объекты за счет введения ZendObj
 

cDLEON

Онанист РНРСlub
berkut
сам ты йокараный бабай.
Данный код не может передать ссылку на переменную Array(1) потому что Array(1) - это статика, а не переменная.
Зы. Я просто думал, что ту функцию писал топик стартер а не ты.
 
Сверху