Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зачем нужно &new, в PHP4? 
V
    Опции темы
Bikutoru
Дата 7.1.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



Здраствуйте, у меня возник один немного философский вопрос.
Но прежде, чем я его задам, нужно привести некоторые рассуждения.

Очень часто в совершенно разных местах я видел код вроде
Код

$someObj = &new SomeClass();


Я знаю, что & это операция взятия указателя на объект, я знаю, что new SomeClass -

это операция создания представителя класса. Таким образом, получается что эти две операции

означают присваивание переменной $someObj указателя на вновь созданный экземпляр

класса SomeClass.
Указатель на объект может потребоваться в двух случаях:
1. передача объекта в метод, где он может быть изменен;
2. наличие нескольких "псевдонимов" для одного и того же объекта (т.е. нескольких

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

Я набросал следующий тест:
Код

<?php

class SomeClass 
{
    var $data;

    function SomeClass() 
    {
        $this->data = 0;
    }

    function add($delta) 
    {
        $this->data += $delta;
    }

    function get()
    {
        return $this->data;
    }
}


function addToObject($obj, $value) // Случай 1
{
    $obj->add($value);
}


$obj1 = new SomeClass();
$obj2 = &new SomeClass();
$obj1->add(1);
$obj2->add(1);
printf("Object 1: %d<br>\nObject 2: %d<br>\n", $obj1->get(), $obj2->get());

$obj1copy = $obj1; // Случай 2
$obj2copy = $obj2;

$obj1->add(10);
$obj2->add(10);
$obj1copy->add(100);
$obj2copy->add(100);
printf("Object 1: %d. Copy of Object 1: %d<br>\n", 
        $obj1->get(), $obj1copy->get());
printf("Object 2: %d. Copy of Object 2: %d<br>\n", 
        $obj2->get(), $obj2copy->get());

addToObject($obj1, 1000);
addToObject($obj2, 1000);
printf("Object 1: %d<br>\nObject 2: %d<br>\n", $obj1->get(), $obj2->get());

?>

Как видно из этого теста (я тестировал в PHP 4.3.8), результаты для $obj1 и $obj2 одинаковы. А

отсюда следует вывод, что &new - абсолютно бесполезная операция, вместо которой

следует использовать
Код

// Для случая 1
function addToObject(&$obj, $value) // Случай 1
{
    $obj->add($value);
}

// Для случая 2
$obj1copy = &$obj1;


Наконец-то я добрался до своего вопроса:
Так зачем нужно &new, какой в нем прок?






--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
mr.fox
Дата 7.1.2006, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 13.3.2005
Где: Ирландия

Репутация: нет
Всего: 2



насколько я знаю, это создает ссылку на сласс. при изменении класса, перменная тоже меняеться..
PM MAIL WWW ICQ   Вверх
Joes
Дата 7.1.2006, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 15.11.2004

Репутация: нет
Всего: 7



В PHP, когда ты изменяешь значения переменных, действия производятся над их копиями. Значит когда ты не передаёшь объект по ссылке при изменении его или его свойств, происходит его копирование в новый объект. Короче говоря, не юзая &, создастся 2 объекта...
В то время, как в PHP5 все объекты, по-моему, изначально являются ссылками. Но это уже другая сказка :-)
Добавлено @ 20:38
точнее 2 копии объекта... че-то я сглючил...
PM MAIL   Вверх
Illuminaty
Дата 7.1.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: 1
Всего: 56



Bikutoru, посмотри в мануале, в разделе Ссылки с глобальными и статическими переменными

Это сообщение отредактировал(а) Illuminaty - 7.1.2006, 20:56
PM MAIL ICQ   Вверх
Mal Hack
Дата 7.1.2006, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



new нужна полюбому для создания объекта.
& надо, чтобы в переменной $a = & new MyC() был указательно место в памяти, занимаемое объектом.
При этом не будет создаваться еще одна копия объекта.
PM ICQ   Вверх
Bikutoru
Дата 8.1.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



Цитата(mr.fox)

насколько я знаю, это создает ссылку на сласс. при изменении класса, перменная тоже меняеться..

Может быть ссылку на объект класса?

Цитата(Joes)

В PHP, когда ты изменяешь значения переменных, действия производятся над их копиями. Значит когда ты не передаёшь объект по ссылке при изменении его или его свойств, происходит его копирование в новый объект. Короче говоря, не юзая &, создастся 2 объекта...

Согласен. При присваивании объектов и передаче объектов в виде параметра в метод объекты клонируются и чтобы этого избежать нужно использовать &. Но речь-то немного о другом. Посмотри, пожалуйста, пример. Объекты
Код

$obj1 = new SomeClass();
$obj2 = &new SomeClass();

ведут себя одинаково (клонируются) и получается, что прока от & перед new никакого!

Цитата(Joes)

В то время, как в PHP5 все объекты, по-моему, изначально являются ссылками. Но это уже другая сказка :-)

Согласен, но речь идет о PHP4 :-(

Цитата(Mal Hack)

new нужна полюбому для создания объекта.
& надо, чтобы в переменной $a = & new MyC() был указательно место в памяти, занимаемое объектом.
При этом не будет создаваться еще одна копия объекта.


Цитата(Bikutoru)

Я знаю, что & это операция взятия указателя на объект, я знаю, что new SomeClass - это операция создания представителя класса. Таким образом, получается что эти две операции означают присваивание переменной $someObj указателя на вновь созданный экземпляр класса SomeClass.

Похожие цитаты, не правда ли :-)

Mal Hack, запусти, пожалуйста, пример и посмотри его вывод.
Код

$obj1 = new SomeClass();
$obj2 = &new SomeClass();

Эти объекты ведут себя совершенно одинаково, они клонируются, а не передаются по ссылке при присваивании и при передаче в качестве параметра.

Illuminaty, замечательная ссылка. Это:
Цитата

The Zend Engine 1, driving PHP 4, implements the static and global modifier for variables in terms of  references. For example, a true global variable imported inside a function scope with the global  statement actually creates a reference to the global variable.

и последующий пример всё объясняют.
Большое тебе человеческое спасибо.

Это сообщение отредактировал(а) Bikutoru - 8.1.2006, 11:46


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 8.1.2006, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(Bikutoru @ 8.1.2006, 11:40 Найти цитируемый пост)

Эти объекты ведут себя совершенно одинаково, они клонируются, а не передаются по ссылке при присваивании и при передаче в качестве параметра.

У тебя не будет создаваться еще одна копия объекта !
Добавлено @ 11:57
Цитата(Bikutoru @ 8.1.2006, 11:40 Найти цитируемый пост)

Эти объекты ведут себя совершенно одинаково, они клонируются, а не передаются по ссылке при присваивании и при передаче в качестве параметра.

Тут они у тебя создаются. Клинирование объектов, это когда $obj1 =$obj2;
Вот пример:
Код

<?php
 
class SomeClass
 {
    
  var $a = "123";    
 }

$obj1 = & new SomeClass();
$obj2 = $obj1;

$obj1->a = "qwe";
$obj2->a = "987";
print $obj1->a . " --- ".$obj2->a."<br>";

?>

Код

<?php
 
class SomeClass
 {
    
  var $a = "123";    
 }

$obj1 = & new SomeClass();
$obj2 = & $obj1;

$obj1->a = "qwe";
$obj2->a = "987";
print $obj1->a . " --- ".$obj2->a."<br>";

?>


Это сообщение отредактировал(а) Mal Hack - 8.1.2006, 11:56
PM ICQ   Вверх
Bikutoru
Дата 8.1.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



Mal Hack, если я тебя правильно понял, то ты предыдущим постом хотел сказать, что при
Код

$obj = new SomeClass();

присутствует операция клонирования вновь созданного объекта при присваивании его переменной, а при
Код

$obj = &new SomeClass();

нет???

Цитата(Mal Hack @ 8.1.2006, 12:55 Найти цитируемый пост)

Тут они у тебя создаются. Клинирование объектов, это когда $obj1 =$obj2;

Ну не надо придираться к мелочам, я привёл именно этот фрагмент, чтобы показать, какие именно объекты имеются в виду. Я же написал
Цитата(Bikutoru @ 8.1.2006, 12:40 Найти цитируемый пост)

они клонируются, а не передаются по ссылке при присваивании и при передаче в качестве параметра

:-)



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 8.1.2006, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Bikutoru когда мы пишем
Код
$obj1 = new SomeClass();
$obj2 = &new SomeClass();

Мы создаем два независимых объекта. НО при этом в памяти объект два будет храниться в единственном экземпляре.
Я мог выше несколько не корретно выразить касательно указателей...

Клонирование это копирование, т.е. $obj1 = $obj2.
Вот если мы тут пишем &, то клонирования не будет, а $obj2 будет синонимом $obj1, по сути она получает указатель на область памяти первого объекта. Если не будем писать &, то тогда будет создан новый объект (выделена под него новый объем памяти) и это уже будет $obj2, не зависимый от 1.
PM ICQ   Вверх
Bikutoru
Дата 9.1.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



Цитата(Mal Hack @ 8.1.2006, 20:47 Найти цитируемый пост)

Мы создаем два независимых объекта. НО при этом в памяти объект два будет храниться в единственном экземпляре.

Это я и имел в виду в своем предыдущем посте. Похоже мы пришли к общему знаменателю. Я все понял (пока так кажется), вопрос закрыт...
Добавлено @ 15:27
P.S. А что это тема в "Профессиональное программирование" переехала, мне казалось, что сий вопрос будет полезен новичкам.


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 9.1.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(Bikutoru @ 9.1.2006, 15:26 Найти цитируемый пост)

P.S. А что это тема в "Профессиональное программирование" переехала, мне казалось, что сий вопрос будет полезен новичкам.

Тема там утонет, чего не хотелось бы.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.