Присвоение полей класса PHP значениям массива при передаче обоих в функцию не устанавливает поля, почему? - PullRequest
1 голос
/ 22 ноября 2010

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

Это работает примерно так:

function unload($arr,&$obj){ <-- //&$obj not $obj
  if($obj->type == 'A'){
    echo 'Setting field for A';
    $obj->a = $arr['a_value'];
    //some more assignments..
  }
  elseif($obj->type == 'B'){
    $obj->b = $arr['b_value'];
    echo 'Setting field for B';
    //some more assignments...
  }
  //some more elseifs
  //return an error if
  //object's type doesn't
  //match
  else{
    echo 'Error: Object type '.$obj->type.' not recognized.';
  }

}

$arr['a_value'] = 'SomeValue';
$arr['b_value'] = 'SomeOtherValue';
$obj = new A(); //A's type set to 'A' upon initialization
unload($arr,$obj);
echo 'A->a set to:  '.$obj->a;

Вывод: A-> a set to:

Код вводит правильную ветвь для объекта, который передается, но ни одно из полей объекта не присваивается.Что я делаю неправильно?

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

Редактировать: Я, наконец, понял, это была комбинация 2 вещей:

Я не осознавал, что ключевое слово $this требовалось при обращении к именам полей класса из класса.Я предполагал, что переменные имеют глобальную область видимости, поэтому $this был необязательным, как в Java.Вот почему просто изменение объявления функции не решило проблему.Теперь все отлично работает!

Ответы [ 2 ]

2 голосов
/ 22 ноября 2010

В какой версии PHP вы работаете?

Потому что в PHP4 вам нужно явно передать объект по ссылке:

function unload($arr,&$obj){

Если вы используете PHP5, дважды проверьте содержимое $arr. И сделать некоторые print_r внутри и снаружи функции ...

0 голосов
/ 22 ноября 2010
  • Если вы хотите получить имя класса, я бы посоветовал вам использовать get_class(), который будет возвращать имя класса.
  • В любом случае, почему вы используете A->a вместо $obj->a?Кажется, это неправильно.
  • И обратите внимание, что switch может наилучшим образом удовлетворить ваши потребности в этом случае.

РЕДАКТИРОВАТЬ Наконец-то понял: вы должнызамените

$arr['a'] = 'SomeValue';
$arr['b'] = 'SomeOtherValue';

на

$arr['a_value'] = 'SomeValue';
$arr['b_value'] = 'SomeOtherValue';

или установите для $obj->b = $arr['a_value']; значение $obj->b = $arr['a']; и сделайте то же самое со значением b.Смысл этого в том, что ключи массива должны быть одинаковыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...