Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: PDO внутри функции [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): « 1 [2]   

> Без описания
DeepVarvar Супермодератор
Отправлено: 01 Декабря, 2015 - 22:21:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DelphinPRO пишет:
ну его нафиг, этот холивар про плохой глобал, тыщу раз все уже обсосано
Ты не ответил на два следующих вопроса.
И я не видел чтобы этот вопрос обсасывали вот в таком свете.
Обычно это заканчивалось а-ля: "ну лаадно, глобал это плоохо..."

Еще чутка наброшу на вентилятор:
PHP:
скопировать код в буфер обмена
  1. class A
  2. {
  3.     public static $a = 1;
  4. }
  5. class B
  6. {
  7.     public function setAofA($num)
  8.     {
  9.         A::$a = $num;
  10.     }
  11. }
  12.  
  13. $b = new B();
  14. // айяяй! по рукам за такое бить надо! это же неявное использование глобалов!
  15. $b->setAofA(22);
 
 Top
DelphinPRO
Отправлено: 01 Декабря, 2015 - 22:27:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




DeepVarvar пишет:
Ты не ответил на два следующих вопроса.


блин.

>> 2) Почему разрабы пыха считают иначе чем "пыхо-глобало-хейтеры"?
пока не считают
мне бабушка рассказывала, что в пыхе когда-то и regicter_globals был и всем нравился.
ps. к хейтерам себя не отношу. иногда код с глобальными переменными проще. но проблемы такого кода всем известны - связанность, сложности при тестировании и т.д. сами все знаете...

>> 3) Кто конкретно первым сказал фразу "глобал это плохо"? Ато очень похоже на байку "если ты это сообщение не напишешь десяти людям у тебя умрет мама".
Ну данное исследование проводить у меня нет желания. особенно сейчас перед сном Улыбка

(Отредактировано автором: 01 Декабря, 2015 - 22:30:52)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DeepVarvar Супермодератор
Отправлено: 01 Декабря, 2015 - 22:29:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DelphinPRO пишет:
пока не считают
Это не кореллируется с первым вопросом-фактом.
DelphinPRO пишет:
в пыхе когда-то и regicter_globals был и всем нравился
Это совершенно другая тема для разговора. Не надо путать глобал скоп и суперглобал.
DelphinPRO пишет:
данное исследование проводить у меня нет желания
Вот у меня тоже. Но при рассмотрении фактов, становится понятно, что это и не нужно.
(Добавление)
DelphinPRO пишет:
связанность, сложности при тестировании и т.д
Т.е. я не зря на вентилятор набросил пример с классами выше, да? ))) Ох уж эти ваши глобальные скопы в ООП, ах негодяи какие!
 
 Top
DelphinPRO
Отправлено: 01 Декабря, 2015 - 22:44:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




DeepVarvar пишет:
Не надо путать глобал скоп и суперглобал.

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


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DeepVarvar Супермодератор
Отправлено: 02 Декабря, 2015 - 08:39:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DelphinPRO пишет:
просто аналогия. две ненужные вещи в языке
Ты не раскрыл что имелось ввиду, хотя я догадываюсь ))
DelphinPRO пишет:
берем хороший фрейм - симфонию - не находим не одного глобала
И там сплошь и рядом глобальные хранилища-фабрики и прочая статичная шушера.
DelphinPRO пишет:
в серьезном проекте глобальные переменные - зло
С учетом предыдущей фразы -- насмешил. Конфиги у тебя глобальны? Да. Коннект глобальный? Да. Ф-ции глобальны? Да ))
А потом вы такие советуете:
Цитата:
function GetUser(\PDO $db, $user_id)
Передавай в каждый чих аргумент, даже если там пять вложений до вызова. И чел такой в шоке:
Рачей пишет:
не понял, ее в каждом запросе туда надо передавать

Да, дорогой, мучайся, не пиши слово глобал, это зло. Почему? А хз. Так все говорят и я говорю и тебе тоже так говорить надо.
DelphinPRO пишет:
не засираете все вокруг глобальными переменными
Неправда. В глобальный скоп всегда что-то кладется, если проект серьезнее хелловорда. А в сях не делают какие-то обертки в виде ф-ций/методов возвращающих значение, как, например, в пыхе для получения состояния или конфига. А если кто-то щас пукнет про то что в плюсах все-же делают какие-то обертки, то там сам синтаксис "заставляет" (в кавычках потому что не заставляет по факту).
 
 Top
DelphinPRO
Отправлено: 02 Декабря, 2015 - 11:00:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Давай не путать понятия глобального контекста вообще и глобальной переменной в частности.
Конфиг у меня глобален. Но доступ к нему я получаю, к примеру, через статический метод класса, для изменения значений тоже имею заданные интерфейсы. Я не затру случайно глобальную переменную $config, я не забуду о ее существовании, потому что ее не существует. Я не буду полчаса искать неведомую ошибку, возникшую из-за невнимательности, потому что конфиг хоть и в глобальном контексте, но это не глобальная переменная (по этой же причине я не люблю паттерн Registry, в такое хранилище тоже можно насрать что угодно).
Да, советовал передавать $db в функцию. Так код читаеемее и надежнее по крайней мере. Я вижу что $db - это экземпляр PDO, а не неведомая глобальная хрень.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Декабря, 2015 - 07:42:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DelphinPRO пишет:
Давай не путать понятия глобального контекста вообще и глобальной переменной в частности
Масло масляное, (ниже поясню).
DelphinPRO пишет:
Конфиг
DelphinPRO пишет:
$config
DelphinPRO пишет:
конфиг
Что ж ты за конфиг зацепился?
Хороший пример для аргументации?
Ни капельки, т.к. все что ты тут расписал относится к инкапсуляции, которая вдогонку, посредством статики, обеспечила глобальный доступ.
DelphinPRO пишет:
Да, советовал передавать $db в функцию

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

Если вернуться к самому первому моему сообщению:
DeepVarvar пишет:
И пусть пишет global -- это гораздо правильнее (в контексте, да, он их не знает, но все же классов, их области видимости и инкапсуляции) чем тупоголовая передача параметров.
При рефакторе будет легче поудалять кучу глобалов и понатыкать $this, чем перепиливать апи с кол-вом и порядком аргументов.

Там все правильно написано даже для:
PHP:
скопировать код в буфер обмена
  1. function a()
  2. {
  3.     b();
  4. }
  5. function b()
  6. {
  7.     c();
  8. }
  9. function c()
  10. {
  11.     global $pdo;
  12.     ...
  13. }

В твоем же примере будет так:
PHP:
скопировать код в буфер обмена
  1. function a(\PDO $pdo)
  2. {
  3.     b($pdo);
  4. }
  5. function b(\PDO $pdo)
  6. {
  7.     c($pdo);
  8. }
  9. function c(\PDO $pdo)
  10. {
  11.     ...
  12. }

Да я врагу такого не пожелаю.
А если там будет не пдо, не экземпляр по ссылке, а массив (копируй меня полностью!)?
А если там несколько аргументов и на каждом уровне вызова разное число аргументов?
А если эти ф-ции используются по всему проекту?
Сколько он рефакторить это все будет?
(Добавление)
DelphinPRO пишет:
Я не затру случайно
DelphinPRO пишет:
я не забуду
Так это личная проблема, а не проблема кода.
Зачем вносить личные проблемы в архитектуру приложения?
Как говорил Мелкий: затер что-то в конфиге? Это ошибка разработки.
Ты же не на боевом сервере все это правишь.
Ну исправишь и дальше поедешь.
Ты еще скажи что код без вспомогательного инструмента (IDE) писать нельзя.
Что ж это за код такой?
 
 Top
DelphinPRO
Отправлено: 03 Декабря, 2015 - 08:53:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Дип, покажи мне пример реального кода, где global необходим (или значительно упрощает код) и используется. Желательно, чтобы это был популярный опенсорс проект.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Декабря, 2015 - 08:55:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Тебе слово global сгрепать или показать аналогичное поведение?
 
 Top
DelphinPRO
Отправлено: 03 Декабря, 2015 - 09:49:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




ну мы же о global говорим.

по остальному:
DeepVarvar пишет:
Что ж ты за конфиг зацепился?
ты сам его предложил в качестве примера.

DeepVarvar пишет:
Ни капельки, т.к. все что ты тут расписал относится к инкапсуляции, которая вдогонку, посредством статики, обеспечила глобальный доступ.

Да. И это избавило меня от глобальной переменной, которая нафиг не нужна.
И если уж говорить о проблеме ТС - коннект к базе тоже следует сделать глобальным "посредством статики", однако я посоветовал передачу параметром предполагая, что так ему будет проще. В любом случае цель - избавление от глобальной переменной.

DeepVarvar пишет:
Да я врагу такого не пожелаю.

Твой пример притянут за уши, так никто не пишет. Давай более реальное что-то.

DeepVarvar пишет:
Так это личная проблема, а не проблема кода.

Согласен. Но хороший код избавит и от некоторых "личных" проблем.
(Добавление)
DeepVarvar пишет:
При рефакторе будет легче поудалять кучу глобалов и понатыкать $this, чем перепиливать апи с кол-вом и порядком аргументов.

Тут я тоже не соглашусь. Чисто механической работы по переписыванию будет не меньше.

(Отредактировано автором: 03 Декабря, 2015 - 09:52:51)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Декабря, 2015 - 11:43:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DelphinPRO пишет:
ну мы же о global говорим
Мы говорим о глобализации доступа, в частности для ФП посредством костыля global.
DelphinPRO пишет:
Да. И это избавило меня от глобальной переменной, которая нафиг не нужна
DeepVarvar пишет:
чож вы им пользуетесь? ))
Почему не передаёте в каждый аргумент каждого метода экземпляр конфига с приватными св-вами и геттерами-сеттерами?

DelphinPRO пишет:
пример притянут за уши, так никто не пишет. Давай более реальное что-то
Контроллер тянет фабрику, фабрика тянет модельку, моделька тянет коннекшн. Норм?
DelphinPRO пишет:
хороший код избавит и от некоторых "личных" проблем
DeepVarvar пишет:
Зачем вносить личные проблемы в архитектуру приложения?

DelphinPRO пишет:
Чисто механической работы по переписыванию будет не меньше
Неа, ты будешь вынужден удалять все пробросы в А, Б и В методах, а тут, только один глобал заменишь на дергалку-статику.
 
 Top
DelphinPRO
Отправлено: 03 Декабря, 2015 - 11:48:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




DeepVarvar пишет:
посредством костыля global.

костыля!!

Всё, спор дошел до логического завершения Улыбка


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Декабря, 2015 - 11:58:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DelphinPRO пишет:
Всё, спор дошел до логического завершения
))
В таком случае, что мешает называть глобальную доступность статического метода в классе костылем?
Что мешает называть глобальную доступность обычной ф-ции костылем?
Почему для ф-ций глобальность работает, а для переменных -- нет?
Как ты объяснишь это?

Я назвал глобал костылем только потому, что изначально, область видимости в пыхе такова, что без глобала ты не добьешься желаемых результатов, когда речь идет о ФП.
 
 Top
DelphinPRO
Отправлено: 03 Декабря, 2015 - 13:37:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Вот привязался-то...

Каких еще желаемых результатов? Х*як-х*як и в продакшн? Нужно писать так, чтобы необходимости в глобале не возникало.

Передавая параметр в функцию, мы имеем простейший пример внедрения зависимости. При написании юнит-теста для этой функции, мы запросто можем сунуть туда заглушку, а не затрагивая базу (речь о примере выше с PDO, но общая суть думаю понятна). А что мы будем делать с глобальными переменными? А если нам нужно протестировать функцию на нескольких наборах данных?

И не важно, правильная в php область видимости для переменных или через костыль. Не нужны они, глобальные переменные.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB