array_push в PHP5

Статус
В этой теме нельзя размещать новые ответы.

Дмитрий_rnd

Новичок
array_push в PHP5

код:

PHP:
$results = array();
for(...) {
	$result->f1 = ...;
	$result->f2 = ...;
	$result->f3 = ...;
	$result->f4 = ...;
	array_push($results, $result);
}
причем $result никак я не объявлял и все действия с ним приведены в примере.
в 4-ке работал код прекрасно. А в пятерке не захотел, поскольку, насколько я понял, 5-ка в массив помещает не $result, а ссылку на него - поэтому весь массив заполнен одними и теми же данными - значением последнего элемента.
Для лечения я стал добавлять $result = false при входе в цикл. Объясните - это баг, фича или я просто использую неправильный стиль.
Посоветуйте правильный подход к такому заполнению.
ЗЫ. Можно, конечно, создать класс, коснструктор и всю такую лабуду, но тогда повозникают десятки и сотни классов, используемых по одному разу и код начнет неоправданно разбухать.
 

Dagdamor

Новичок
А нельзя сделать так:

PHP:
$result=array();
$result["f1"]=...;
$result["f2"]=...;
$result["f3"]=...;
$result["f4"]=...;
$results[]=$result;
?
 

Дмитрий_rnd

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

-~{}~ 12.01.06 10:02:

Но вопрос остается открытым: это баг или фича php5?
 

kruglov

Новичок
Мне кажется, скорее багом являлось поведение 4-ки. Вам нужен массив - объявляйте массив, а не надейтесь, что php как-нибудь сам догадается.

p.s. Попрограммировали бы на чем-нибудь строго типизированном, на той же Java, например, приобрели бы полезную привычку объявлять типы данных. И не пользоваться недокументированными возможностями ("Never rely on bug"), которые могут быть, наконец, "исправлены в следующей версии"
 

bkonst

.. хочется странного?...
Фича. Большая часть ОО-языков поступают в этом случае точно также - тот же Python, например.
 

Дмитрий_rnd

Новичок
вопрос не в том, что массив или нет. А в том, что по документации, насколько я понял, array_push должен помещать копию переменной, а не указатель на нее.
 

bkonst

.. хочется странного?...
Нет там ни такого, ни противоположного утверждения.

С другой стороны, при обычном присваивании (в PHP5) объект не копируется. Почему поведение array_push должно отличаться?
 

Дмитрий_rnd

Новичок
а разве строка
int array_push ( array &array, mixed var [, mixed ...] )
в документации не означает, что var передается не по ссылке, а создается копия при вызове функции?

-~{}~ 12.01.06 11:02:

зы. 2kruglov я то сам сишник... а в пхп поневоле. Посмотрел - работает использовал, правда самому не нравилось, что не объявляю $result явно

-~{}~ 12.01.06 11:03:

зы2. так работал, поскольку все еще не могу нормально освоиться со строковыми индексами в массивах - как-то с предубеждением к ним отношусь. :)
 

bkonst

.. хочется странного?...
Для объектов PHP5 - не означает. Они всегда (насколько я помню) передаются по ссылке (a-la Java / Python).
 

Дмитрий_rnd

Новичок
Ладно, а как тогда (но это не для этого случая, а так для общего развития) создать копию объекта? (и если не затруднит - тоже самое на Java и будет ли это работать в JavaScript?)
 

bkonst

.. хочется странного?...
Реализовать операцию копирования, например.
PHP:
class Test {
  var $field;
  ...
  function copy() {
    $obj = new Test();
    $obj->set_field($this->field);
    ....
    return $obj;
  }
}
В Javascript - аналогично, в Java - можно просто определить конструктор копирования.

Кстати, в твоем случае можно было бы поступить проще (если, конечно, использование классов, а не массивов в этом случае имеет смысл):
PHP:
for (...) {
    array_push($results, new Result(...));
}
 

Дмитрий_rnd

Новичок
bkonst, оно то понятно, что все ручками - мы то люди привычные ... а хотелось простоты и халявы :)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху