На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS

Дорогие друзья! Поздравляем вас с Новым 2018 годом!

Всем удачи, успеха и благополучия!
В новом году ожидаем новых рекордов при подсчёте количества ёлочек на экране ;)


msm.ru
! ПРАВИЛА РАЗДЕЛА
Прежде чем задать вопрос, зайдите в раздел FAQ, возможно там уже есть ответ на него.
Если вы хотите вставить код в сообщение, то пожалуйста выделяйте его тегом [code=dfp] ... [/сode].
Для этого используйте кнопку [code=dfp] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Delphi for PHP.
Модераторы: ViktorXP, vicis
  
> Переменные, видимость
    есть у меня вот такой код

    (пробую вот рунтайм)

    ExpandedWrap disabled
          function Button1Click($sender, $params)
          {
          global $B;
          $B=new Memo;
       
          $B->show();
       
          }
          function Button3Click($sender, $params)
          {
          var_dump($B);
          }
      }
       
      global $application;
      global $B;
      global $Page11
    ;

    Мемо создается, НО.... переменная $B из кода
    ExpandedWrap disabled
      function Button3Click($sender, $params)
          {
          var_dump($B);
          }

    пустая, хоть и описана как глобал, я что то не так делаю ? )
      Каждый раз в функции надо добавлять global $B; чтобы она ее видела. ( в самом начале перед первым использованием в теле функции)
      Сообщение отредактировано: Alex2011 -
        Цитата Alex2011 @
        Каждый раз в функции надо добавлять global $B; чтобы она ее видела. ( в самом начале перед первым использованием в теле функции)

        Спасибо
          Цитата Serafim @
          Цитата ssaich @
           global

          Предлагаю нафиг закрыть и сжечь этот раздел :ph34r: ну пожааалуйста... :'(

          а на этом форуме есть возможность бана флудеров,троллей и т.д.
            Цитата Eremeev @
            а на этом форуме есть возможность бана флудеров,троллей и т.д.

            Есть. Правда тебе осталось доказать, что тех людей, кто использует глобалсы не стоит отгорожать от сообщества разумных людей. :whistle:
            user posted image
              Цитата Eremeev @
              а на этом форуме есть возможность бана флудеров,троллей и т.д.

              дадим ему ещё шанс, хотя все признаки на лицо :ph34r:
                Я просто слишком насмотрелся на такой код в исходниках нашего форума, что бы просто так пройти мимо и не намекнуть на то, что писать такой код ни в коем случае нельзя. Для получения более подробной информации о качестве кода можно воспользоваться, например этим https://scrutinizer-ci.com/ или похожей поделкой от сенсиолабс https://insight.sensiolabs.com/

                Примеры работы обоих инструментов (мои опенсорсные проекты), с позволения г-на vicis тут: SensioLabs Insight и Scrutinizer Coninuous Integration.

                Да, я приверженец идеального кода, т.к. исправление и поддержка совсем уж стрёмного потом обходится значительно дороже, как в плане денежной стоимости, так и в плане временных рамок - уже не раз сталкивался с подобными ситуациями.

                Если мои комментарии похожи на троллинг - прошу простить, но меня откровенно возмущает помощь по таким вопросам без замечания "я тебе помогу, но это плохой код" ;)

                Добавлено
                В любом случае, что бы не быть голословным:

                исходный код
                Цитата
                function Button1Click($sender, $params)
                {
                global $B;
                $B=new Memo;

                $B->show();

                }
                function Button3Click($sender, $params)
                {
                var_dump($B);
                }
                }

                global $application;
                global $B;
                global $Page11


                1) Использовать global крайне нежелательно.
                2) В методах Button3*** отсутствует упоминание видимости переменной, что противоречит стандартам Zend и PSR. Стандарт PEAR уже давно признан недееспособным.
                3) Переменные ($B) пишутся в $camelCase, начиная с маленькой буквы: http://www.php-fig.org/psr/psr-1/ п.4.2.
                4) Названия методов пишутся в camelCase: http://www.php-fig.org/psr/psr-1/ п.4.3.
                5) Отсутствие отступов внутри методов. Внутри методов должен быть отступ в 4 пробела: http://www.php-fig.org/psr/psr-2/ п.2.4. (за исключением стандарта Wordpress, где рекомендуется использовать табы)

                :whistle:
                Сообщение отредактировано: Serafim -
                user posted image
                  Цитата

                  Если мои комментарии похожи на троллинг - прошу простить, но меня откровенно возмущает помощь по таким вопросам без замечания "я тебе помогу, но это плохой код"

                  плохой код или плохое оформление кода?
                  если кто то учится пхп, то уж не в первую очередь оформлению кода,
                  а самим основам. а желание оформить потом само придет.
                  мог бы и знать такие вещи, а не требовать закрытий топиков
                    Цитата Eremeev @
                    плохой код или плохое оформление кода?
                    если кто то учится пхп, то уж не в первую очередь оформлению кода,
                    а самим основам. а желание оформить потом само придет.
                    мог бы и знать такие вещи, а не требовать закрытий топиков

                    И то и другое. Я списочек специально написал ;)

                    Добавлено
                    Но если на код стайл ещё пофигу, то ещё в сообщении #6 я обосновал причину такой своей бурной реакции. Т.к. даже новички (тем более новички) и слышать не должны о наличии такой конструкции в языке, как глобалс. ;)
                    Сообщение отредактировано: Serafim -
                    user posted image
                      Цитата
                      Т.к. даже новички (тем более новички) и слышать не должны о наличии такой конструкции в языке, как глобалс

                      вот они и не зная потом и задают такие вопросы, раз не должны знать.
                      покажи мне как в этом коде обойтись без глобал.
                      ExpandedWrap disabled
                            function curr_day_ButtonClick($sender, $params)
                            {
                              global $Service_DB ;
                              $Service_DB->select_catalog_product_curr_day(date('Y-m-d'),date('Y-m-d') , $_SESSION['id_f'], $_SESSION['id_app']);
                            }

                      ты еще про goto как то забыл упомянуть.
                        Цитата Eremeev @
                        ты еще про goto как то забыл упомянуть.

                        Ну это само собой, я по этому случаю даже картиночку припрятал :yes:

                        Прикреплённый файлПрикреплённый файл292_v1.png (25,38 Кбайт, скачиваний: 468)

                        Цитата Eremeev @
                        покажи мне как в этом коде обойтись без глобал.

                        Ну чтож...

                        Тупо статик:
                        ExpandedWrap disabled
                          class ServiceDB
                          {
                              public static function select_catalog_product_curr_day()
                              {
                                  // ****
                              }
                          }
                           
                          ....
                           
                              public function curr_day_ButtonClick()
                              {
                                  ServiceDb::select_catalog_product_cur...
                              }


                        Singleton:
                        ExpandedWrap disabled
                          class ServiceDB
                          {
                              private static $instance = null;
                           
                              public static function getInstance()
                              {
                                  if (static::$instance === null) { static::$instance = new static; }
                           
                                  return static::$instance;
                              }
                           
                              private function __construct() {}
                          }
                           
                          ServiceDb::getInstance()->select...


                        UPD: Скрыл лишнее, чтоб не портить психику
                        Ещё Немного примеров как обойтись без глобалов


                        Registry и Ioc:
                        ExpandedWrap disabled
                          class Registry extends ArrayAccess
                          {
                              // переписывать всю реализацию ArrayAccess - лень, так что опускаю её
                           
                              protected static $facadeInstance = null;
                           
                              public static function get($alias)
                              {
                                  return static::$facadeInstance[$alias];
                              }
                           
                              public static function resolve($alias, callable $instance)
                              {
                                  return static::$facadeInstance[$alias] = $instance(static::$facadeInstance);
                              }
                              
                              public static function setFacade(Registry $self)
                              {
                                  static::$facadeInstance = $self;
                              }
                          }
                           
                          Registry::setFacade(new Registry);
                           
                          Registry::resolve('service', function(){
                              return new ServiceDb;
                          });
                           
                          Registry::get('service')->select_catalog_product....



                        Dependency Injection:
                        ExpandedWrap disabled
                          DiContainer::resolve(function(){ return new ServiceDb; });
                           
                          DiContainer::inject(Класс_с_методом_curr_day_ButtonClick::class);
                           
                          ....
                          public function curr_day_ButtonClick(ServiceDb $db)
                          {
                            $db->select_catalog_.....
                          }



                        Dependency Injection на аннотациях:
                        ExpandedWrap disabled
                          DiContainer::resolve(function(){ return new ServiceDb; });
                           
                          DiContainer::inject(Класс_с_методом_curr_day_ButtonClick::class);
                           
                          /**
                           * @DiContainer\Inject(db = "ServiceDb")
                           */
                          public function curr_day_ButtonClick($db)
                          {
                            $db->select_catalog_.....
                          }


                        Наследование:
                        ExpandedWrap disabled
                          abstract class AbstractApplicationRegistry
                          {
                              protected static $container = [];
                           
                              public static remember($alias, $value)
                              {
                                 static::container[$alias] = $value;
                              }
                           
                              public function __get($name)
                              {
                                  return isset(static::$container[$name]) ? static::$container[$name] : null;
                                  // В PHP 7.0: return static::$container[$name] ?? null;
                              }
                          }
                           
                          class Some extends AbstractApplicationRegistry
                          {
                              public function curr_day_ButtonClick($db)
                              {
                                  $this->serviceDb->select_catalog_.....
                              }
                          }


                        Трейты:
                        ExpandedWrap disabled
                          trait ApplicationRegistry
                          {
                              protected static $container = [];
                           
                              public static remember($alias, $value)
                              {
                                 static::container[$alias] = $value;
                              }
                           
                              public function __get($name)
                              {
                                  return isset(static::$container[$name]) ? static::$container[$name] : null;
                                  // В PHP 7.0: return static::$container[$name] ?? null;
                              }
                          }
                           
                          class Some
                          {
                              use ApplicationRegistry;
                           
                              public function curr_day_ButtonClick($db)
                              {
                                  $this->serviceDb->select_catalog_.....
                              }
                          }


                        Добавлено
                        О, ещё аннотациями можно:
                        ExpandedWrap disabled
                          /**
                           * @Annotation
                           * @Target("CLASS")
                           */
                          class Container
                          {
                              private $container = [];
                           
                              public function __construct(array $values)
                              {
                                  $this->container = $values;
                              }
                           
                              public function apply(ReflectionClass $context)
                              {
                                  // тут выбираем нужные значения из общего контейнера данных и отправляем их в $context
                              }
                          }
                           
                          /**
                           * @Container(serviceDb = ServiceDb::class)
                           */
                          class Some
                          {
                              public function curr_day_ButtonClick($db)
                              {
                                  $this->serviceDb->select_catalog_.....
                              }
                          }


                        Добавлено
                        Плюс Композицию, как альтернативу наследованию никто не отменял :whistle:

                        Добавлено
                        А ещё можно на этапе автолоада классов, через рефлексию внедрять объект контейнера с инстансами...

                        Добавлено
                        А ещё можно хранить это всё в одном классе и вытаскивать через объект замыкания (Closure) с переносом контекста (bind или bindTo). Это кстати дико магический способ - я уже приводил в пример динамическое наследование, примерно так же и сделать: Нужен пример неизменяемого класса и класса от которого нельзя наследоваться

                        Добавлено
                        А ещё можно назначить свой поток (функция stream_wrapper_register), например "inject://" (как это сделано у меня https://github.com/SerafimArts/Mirror/blob/...ader/Filter.php) и подменять реализацию классов вообще как угодно, делая с ними всё что угодно. Правда там токенизер нужен будет и лексер... И вообще это изврат.

                        Добавлено
                        Ну что, ещё? :D Теперь предлагаю задавать вопросы, чтоб я показал более точную реализацию (полностью рабочий пример) и вы больше никогда в жизни не использовали глобалсы.

                        Добавлено
                        Цитата Serafim @
                        Dependency Injection:

                        есть кстати очень крутая либа для этого: http://php-di.org/
                        Сообщение отредактировано: Serafim -
                        user posted image
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script Execution time: 0,1523 ]   [ 18 queries used ]   [ Generated: 23.01.18, 05:55 GMT ]