На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Serafim, fatalist
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
    > Передача параметров всегда по ссылке , Есть ли в этом смысл? (PHP)
      Вдруг подумалось... а может при определении функции всегда задавать &$<varname>? Вроде как экономия памяти получается? а?
        ... и расход трафика. неэффективно!
          Причем здесь траффик?
            ой, извини, не внимательно посмотрел на трейд %))
            интересная идея, вот что я нарыл по ней:

            Цитата

            Not using the & operator causes a copy of the object to be made. If you use $this in the class it will operate on the current instance of the class. The assignment without & will copy the instance (i.e. the object) and $this will operate on the copy, which is not always what is desired. Usually you want to have a single instance to work with, due to performance and memory consumption issues.


            Насколько я понял - при использовании ссылок действительно не создаются копии объектов класса, что экономит память.
            Но (имхо) действительный прирост производительности будет заметен только при использовании массивов или объектов довольно большого размера, так что насчет целесообразности использования метода я не уверен...
              Ну ясен пень, если массив большой или проект немаленький...

              Хотелось бы минусы услышать. Если это так хорошо и правильно, то почему все так не делают?

              Естественно, в случае, если нужно только прочитать значение внутри функции.
                Та же проблема есть и в С. Гораздо хуже будет если не поставишь амперсанд - запаришся баг вылавливать!
                  Об этом спорят уже давно, особенно в C/C++. В C# эта проблема решена разделением на ссылочные типы и типы, передающиеся по значению.
                  PHP при передаче аргумента создается локальная копия. Есть другой вариант, кроме передачи по ссылке: объявление переменной глобальной:
                  ExpandedWrap disabled
                    function process_array()
                    {
                      global $big_array; // Массив берется из внешней области видимости
                      for($i = 0; $i < count($big_array); $i++)
                      // Действия над массивом и т.д.
                    }

                  Так геморроя над кодом гораздо меньше, чем передача по ссылке. Есть другие уловки. Сейчас навскидку я про них рассказать не могу...
                    Вот, написал небольшой advanced мануал по функциям в PHP и поместил его в FAQ. Всем PHP-программерам - must read!
                      Вопрос на засыпку:

                      В чем разница между

                      ExpandedWrap disabled
                         
                        function &foo()
                        {
                                return &$bar;
                        }


                      и

                      ExpandedWrap disabled
                         
                        function &foo()
                        {
                                return $bar;
                        }
                         
                        $bar = &$foo();
                        Ошибочка:
                        Цитата
                        function &foo()
                        {
                        return $bar;
                        }

                        $bar = &$foo();

                        Во-первых, переменная вроде как должна возвращать ссылку а возвращает переменную. Надо так:
                        ExpandedWrap disabled
                          function &foo()
                          {
                                  return &$bar;
                          }

                        (Это не я так придумал, см. PHP Manual).
                        Во-вторых, $bar = &$foo();, ты вроде как вызываешь переменную-функцию, в то время как значение переменной (т.е. имя функции) не присвоено.
                        Тогда уж надо бы так:
                        ExpandedWrap disabled
                          function foo()
                          {
                                  return $bar;
                          }
                          $func = 'foo';
                          $bar = &$func();

                        А вообще, зачем тебе так нужно издеваться?
                          Да, ошибся чуть-чуть. Имелось ввиду:

                          ExpandedWrap disabled
                             
                            function &foo()
                            {
                                    return &$bar;
                            }

                          и

                          ExpandedWrap disabled
                             
                            function &foo()
                            {
                                    return $bar;
                            }
                             
                            $bar = &foo();


                          Так в чем же разница? :)
                          Сообщение отредактировано: rvt -
                            Вся разница в стиле программирования. Конечно, всегда можно передавать параметр по указателю, НО когда передаем ф-ции указатель, ето означает, что мы собираемся модифицировать параметр, а ведь ето не всегда так. Передача указателя на переменную являющуюся в данном случае константой - ошибка стиля программирования, которая в результате может привести к реальным багам.
                              ...это к теме передачи параметров в функцию.

                              А по поводу возврата - второй пример взят из PHP Manual. Есть подозрение, что первый пример поддерживается но, как говорится, depreciated...
                                Не стоит заморачиваться с возвратом ссылок. Обычно это используется при работе с объектами. В PHP4 объекты копируются и передаются по значению, а в PHP5 - по ссылке. Выводы делаем соответствующие.
                                  Вопрос в том, где истина. Тем более, если твой мануал прочитает десяток другой народу и не потрудятся в мануал глянуть...
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0341 ]   [ 16 queries used ]   [ Generated: 23.04.24, 12:11 GMT ]