Граммотное использование "&" при создании объектов и описании функций

slego

Новичок
Грамотное использование "&" при создании объектов и описании функций

Я уже задавал этот вопрос, меня отправили по адресу, но я все равно вернулся, т.к. понимания не появилось :D

Как говорится, лучше спросить еще раз и побыть дураком 5 минут, чем оставаться им всю жизнь.

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

PHP:
class Foo
{
   //...
   function Foo()
   {
      // ...
   }
   //...
};

$bar =& Foo();
или так
PHP:
function &Foo($param)
{
    return ++$param;
}

$bar = &Foo(3);
Только умоляю, не отсылайте меня больше к http://ua2.php.net/manual/en/language.oop.newref.php и к другим подобным ресурсам. Я все внимательно прочитал, там куча примеров, где показано, как и куда может ссылаться $bar при использовании ссылок. Я просто не пойму для чего это может понадобиться, где практическое применение всему этому?
Где-то вычитал, что , если при создании объектов использовать конструкцию =&, тогда корректно вызываются деструкторы. Не знаю, насколько этому можно верить.

На php перешел после c++.
Допустим, там можно создать объекты как

CFoo foo;
foo.value = 2;
foo.func(3);

так и

CFoo* foo = new CFoo;
foo->value = 2;
foo->func(3);
delete foo;

Возможно это является некой аналогией способам

$bar = new Foo()

и

$bar =& new Foo()

???:rolleyes:


Огромное спасибо всем тем, кто дочитал до конца :)
 

vitus

мимо проходил
в обычной жизни они не очень-то и требуются ...
когда потребуются - думаю сам сможешь понять -
для чего это может понадобиться, где практическое применение всему этому
про деструкторы - не понял, вроде в 4-м их явных нет...
а в 5-м и без & все объекты передаются по ссылке...
 

slego

Новичок
спасибо, уже хоть какая-то информация. А с функциями что делать будетм? :)

-~{}~ 03.03.05 17:10:

Автор оригинала: vitus
когда потребуются - думаю сам сможешь понять
Думаю не смогу, если я вообще не понимаю, так сказать, физического смысла сих действий :)
 

_RVK_

Новичок
slego
Для начала, наверное, стоит разобраться что есть переменная, а что есть ссылка на переменную.

Для чего нужны ссылки? А для того, что бы использовать ссылки, а не копии переменных. Допустим у тебя есть объект класса query для работы с БД. Этот класс используется в классах News и Articles. Если ты сделаешь копию объекта, то каждый из этих классов будет работать со своей копией, а если передашь ссылку, то каждый будет работать с одним и тем же экземпляром. Помимо экономии памяти, это еще позволяет, например вывести все запросы выполненные в программе, не зависимо от того, в каком месте эти запросы были выполненны.
Насчет функции. Например твоя функция работате с большим массивом. Не кажется ли тебе, что лучше в этом случае передать ссылку на массив, вместо того что бы делать его копию?
 

slego

Новичок
Автор оригинала: _RVK_
Насчет функции. Например твоя функция работате с большим массивом. Не кажется ли тебе, что лучше в этом случае передать ссылку на массив, вместо того что бы делать его копию?
Имеется в виду что-то типа следующего
PHP:
function fun(&$arr)
{
     for($i =0; $i < count($arr); $i++)
     {
          $arr[$i] ++;
     }
     return 1;
}
$arr = array(1,2,3,4,5);
fun($arr);
print_r($arr);    //   получим 2,3,4,5,6
?
 

_RVK_

Новичок
Да. Если сказать вообще грубо, то если данные маленькие, нужно использовать копии, если большие, ссылки. Хотя конечно, программист всегда должен понимать что он делает и для чего. Если пока не можешь понять, не отчаивайся. Придет время, поймешь.
 

SiMM

Новичок
А как же "copy on write"? Или в этом и заключалась "грубость"?
 

slego

Новичок
Кажется (кажется) стало что-то проясняться. Если я правильно понял, тогда следующее
PHP:
function &fun($foo) 
{ 
     return ++$foo; 
} 

$foo = 0;
$bar = & fun($foo); 
$bar++; 
echo $foo;    //   2
выведет 2. Правильно?

-~{}~ 03.03.05 18:48:

Автор оригинала: _RVK_
Для чего нужны ссылки? А для того, что бы использовать ссылки, а не копии переменных. Допустим у тебя есть объект класса query для работы с БД. Этот класс используется в классах News и Articles. Если ты сделаешь копию объекта, то каждый из этих классов будет работать со своей копией, а если передашь ссылку, то каждый будет работать с одним и тем же экземпляром. Помимо экономии памяти, это еще позволяет, например вывести все запросы выполненные в программе, не зависимо от того, в каком месте эти запросы были выполненны.
А подобная схема (доступ к одному и тому же экземпляру класса Query из классов News и Article) возможна без использования паттерна Singleton?

-~{}~ 03.03.05 18:58:

мдаа.. значит не понял. Попробовал, вывело 0.... :(
А счастье было вот так близко, и так близко, и вот так!
 

vitus

мимо проходил
PHP:
function &fun(&$foo) 
{ 
     return ++$foo; 
} 

$foo = 0; 
$bar = &fun($foo); 
$bar++; 
echo $foo;    //   2
 

slego

Новичок
Хорошо, а если все-таки

function &fun($foo)

тогда $bar будет ссылаться не понятно на что?
 

vitus

мимо проходил
кстати с query - не показательно, у квери есть ещё ссылка на внешний ресурс (а что там у вас ещё?), и она наверняка будет одинаковая, хоть копируй , хоть что хош делай

-~{}~ 03.03.05 19:09:

тогда $bar будет ссылаться не понятно на что?
а какая разница как ты объявил $foo

так $foo = 0;
или так $bar = &fun($foo);

?
 

slego

Новичок
не очень понял вопрос. Если честно, не понимаю. Результат выполнеия функции, это же, по-идее, какое-то значение (НЕ переменная).
Ведь $bar = &fun($foo); ссылка на результат функции? Как такое может быть?

-~{}~ 03.03.05 19:18:

Хотя, протупил, функция может вернуть объект, тогда, наверное понятно, как такое может быть :)
 

vitus

мимо проходил
ну правильно, а результат функции - ссылка на её параметр :)
 

slego

Новичок
Прошло 10 лет, подростали дети, наконец стал понемногу доходить смысл ссылок....... :)

-~{}~ 03.03.05 19:21:

На какой-такой параметр?
 

slego

Новичок
Автор оригинала: vitus

смешнее можно сделать :

$foo=&$bar;
$foo1=&$bar;

$bar="Barrrrr";
echo "$foo ... $foo1";
Не, ну с этим как бы проблем не возникает. Понятно, что фу и фу1 дружно ссылаются на одну и ту же переменную. Пока не понятно, для чего может понадобится ссылка на то, что возвращается из функции. Ну да ладно, думаю, дожму рано или поздно.
Это классическая ситуация, которая происходит в два этапа: сначала ПРИВЫКАЕШЬ и СЖИВАЕШЬСЯ с этим, а потом ПОНИМАЕШЬ :D

воу, вчера просто феерия с референсами была !

соседний топик:
http://phpclub.ru/talk/showthread.php?s=&threadid=63359&rand=6
это хорошо, значит не один я "потерянный" :)

vitus спасибо, дружище, уже не раз помогаешь.

Всем также огромное спасибо за внимание и помощь.
 

_RVK_

Новичок
Пока не понятно, для чего может понадобится ссылка на то, что возвращается из функции
Простой пример. У тебя есть объект, одним из свойств которого является массив объектов (в терминах паттернов Factory, если не ошибаюсь). У него есть метод, возвращающий ссылку на объект. Именно ссылку, а не сам объект.
 

neko

tеam neko
SiMM
cow это дело сугубо gc'шное
и в юзерленде о таких вещах лучше не думать
 
Сверху