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 :: Извлечение переменных из массива, в локальную область видимости.

 PHP.SU

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


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

> Без описания
re2enX
Отправлено: 15 Сентября, 2017 - 11:36:01
Post Id


Новичок


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


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




Доброго времени суток.
Есть массив:
PHP:
скопировать код в буфер обмена
  1.  
  2. $test = array(
  3.         'item_1' => 'Item 1 Data',
  4.         'item_2' => 'Item 2 Data',
  5.         'item_3' => 'Item 3 Data',
  6.         'item_4' => 'Item 4 Data'
  7. );
  8.  


Для того чтобы распаковать элементы массива, как переменные, в текущую область видимости, применяют функцию extract(), например:
PHP:
скопировать код в буфер обмена
  1.  
  2. function fn() {
  3.         extract($test);
  4.  
  5.         echo $item_3;
  6. }
  7.  

Имеет-ли право на жизнь, следующий код:
PHP:
скопировать код в буфер обмена
  1.  
  2. function fn() {
  3.         foreach ($test as $key => $value) {
  4.                 $$key = $value;
  5.  
  6.                 // http://php.net/manual/ru/language.variables.variable.php
  7.         }
  8.  
  9.         echo $item_2;
  10. }
  11.  

Допустим в массиве $test, ключи фиксированы (новые не добавляются, существующие не удаляются), меняется лишь значение ключей. В этом случае, нужно применять unset() в конце вызова функции? Пример:

PHP:
скопировать код в буфер обмена
  1.  
  2. function fn() {
  3.         foreach ($test as $key => $value) {
  4.                 $$key = $value;
  5.         }
  6.  
  7.         echo $item_2;
  8.  
  9.         foreach ($test as $key => $value) {
  10.                 unset($$key);
  11.         }
  12. }
  13.  
  14.  


Или можно обойтись и без unset()? Чем грозит такой подход? Спасибо.

(Отредактировано автором: 15 Сентября, 2017 - 11:40:48)

 
 Top
MouseZver
Отправлено: 15 Сентября, 2017 - 12:12:42
Post Id



Новичок


Покинул форум
Сообщений всего: 58
Дата рег-ции: Июнь 2017  
Откуда: php.ru


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




в документации все описанно, как работать с массивом и вынести переменные
extract($var_array, EXTR_PREFIX_SAME, "wddx");

не говнокодьте
 
 Top
re2enX
Отправлено: 15 Сентября, 2017 - 13:26:25
Post Id


Новичок


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


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




MouseZver пишет:
в документации все описанно, как работать с массивом и вынести переменные
extract($var_array, EXTR_PREFIX_SAME, "wddx");

не говнокодьте

Уважаемый вопрос не о том как юзать функцию extract(), я прекрасно умею читать документацию. Перечитайте вопрос! Для флуд-а есть соответствующий раздел.
 
 Top
andrewkard
Отправлено: 15 Сентября, 2017 - 16:28:13
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


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




re2enX пишет:
Имеет-ли право на жизнь, следующий код:

нет, для этого есть родная функция extract
соотв. эти вопросы отпадают
re2enX пишет:
Или можно обойтись и без unset()? Чем грозит такой подход? Спасибо.

(Добавление)
Кроме того, Ваша функция function fn() вряд ли знает о переменной $test
 
 Top
re2enX
Отправлено: 15 Сентября, 2017 - 19:27:20
Post Id


Новичок


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


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




[quote=andrewkard][/quote]

Почему "Нет."? чем это чревато, можете объяснить? Я знаю что существует родная функция extract() <сарказм>Огромное вам спасибо, вы открыли мне глаза</сарказм>. И нет! Вопрос не отпадает, ведь получается, если у кода нет "печальных" последствий, то способ имеет право на жизнь.

Весь написанный мною код, приведен в качестве примера, общая идея ясна и прекрасно передает суть.

(Отредактировано автором: 15 Сентября, 2017 - 19:44:58)

 
 Top
LIME
Отправлено: 15 Сентября, 2017 - 22:29:09
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




re2enX пишет:
общая идея ясна и прекрасно передает суть.
мне не ясна
потрудись пояснить в чем вопрос
пожалуйста
тебе вполне справедливо намекнули что области видимости не совпадают, ты видимо пишешь код в форуме а не в действительности
потести
то есть ты предполагаешь что-либо не проверив...имхо
---
по сабжу
нет смысла ансетить чтолибо если это не важно для последующего кода
php рожден чтобы умереть - это означает что память освобождается после отработки скриптов...кроме некоторых интересных случаев ...это не он
 
 Top
Строитель
Отправлено: 15 Сентября, 2017 - 22:57:14
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




re2enX пишет:
ведь получается, если у кода нет "печальных" последствий
Печальные последствия обязательно появятся при отладке такого говнокода.

На сколько мне известно, переменные переменных - это такая же плохая практика, что и global в пользовательских функциях. Иначе говоря, использовать можно (есть в ЯП такая возможность) но не желательно.
 
 Top
LIME
Отправлено: 15 Сентября, 2017 - 23:17:06
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




Строитель пишет:
На сколько мне известно, переменные переменных
я подумал вопрос в необходимости ансетить ненужные переменные
но видимо абшибся и вопрос впринципе о заменимости екстракта подобным циклом
---
вобщем и целом -
сам екстракт сомнительная ф-ция
наводит на вопрос - если не знаешь какие переменные у тебя есть может подумаешь об архитектуре приложения еще раз?
но это все общие слова
в итоге
получаем неконтролируемые переменные
которые могут совпадать именем с уже существующими = потенциальная дыра + сложность отладки как сказал коллега
+ есть подозрение в непонимании областей видимости...имхо тс пришел в пхп после js
в пхп нет внешнего скопа если специально его не задать в замыкании
Строитель пишет:
переменные переменных - это такая же плохая практика, что и global в пользовательских функциях.
такая же плохая но не такая же
глобальные переменные рискуют быть переписанными в любой момент другим кодом когда твой пакет этого не ждет
ну + конфликт имен конечно
+ невозможность повторного использования
переменная переменной это скорее минус динамического объявления переменных
в чемто минусы пересекаются но не совсем то же самое
минус этого еще в невозможности поддержки среды разработки так как тип определяется в рантайме а не в объявлении
Строитель пишет:
Печальные последствия обязательно появятся при отладке такого говнокода.
это да...но гораздо печальнее будет чтение такого... кода
(Добавление)
короче нельзя не потому что нельзя а потому что плохо))
 
 Top
Строитель
Отправлено: 15 Сентября, 2017 - 23:40:04
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




LIME пишет:
Строитель пишет:
На сколько мне известно, переменные переменных
я подумал вопрос в необходимости ансетить ненужные переменные
но видимо абшибся и вопрос впринципе о заменимости екстракта подобным циклом
---
вобщем и целом -
сам екстракт сомнительная ф-ция
наводит на вопрос - если не знаешь какие переменные у тебя есть может подумаешь об архитектуре приложения еще раз?
но это все общие слова
в итоге
получаем неконтролируемые переменные
которые могут совпадать именем с уже существующими = потенциальная дыра + сложность отладки как сказал коллега
+ есть подозрение в непонимании областей видимости...имхо тс пришел в пхп после js
в пхп нет внешнего скопа если специально его не задать в замыкании
Строитель пишет:
переменные переменных - это такая же плохая практика, что и global в пользовательских функциях.
такая же плохая но не такая же
глобальные переменные рискуют быть переписанными в любой момент другим кодом когда твой пакет этого не ждет
ну + конфликт имен конечно
+ невозможность повторного использования
переменная переменной это скорее минус динамического объявления переменных
в чемто минусы пересекаются но не совсем то же самое
минус этого еще в невозможности поддержки среды разработки так как тип определяется в рантайме а не в объявлении
Строитель пишет:
Печальные последствия обязательно появятся при отладке такого говнокода.
это да...но гораздо печальнее будет чтение такого... кода
(Добавление)
короче нельзя не потому что нельзя а потому что плохо))
+++++
Твой ответ оказался наиболее полным )

PS: Привет Закатив глазки
 
 Top
LIME
Отправлено: 15 Сентября, 2017 - 23:42:54
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




Строитель как модер юзай спойлер))
привет))

как на новом месте? прижился?

(Добавление)
Строитель пишет:
Твой ответ оказался наиболее полным )
ну....какбэ...епрст...
не лаптем ентер нажимаем)) знаем немножко чутьчуть))
спрашивайте ежели запутаетесь
не лучше мелкого...он реально умный...а я просто говорю что знаю)
 
 Top
Строитель
Отправлено: 16 Сентября, 2017 - 10:19:09
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




Сори за фтопик
LIME пишет:
как на новом месте? прижился?
Пока всё ок, спс )
 
 Top
re2enX
Отправлено: 16 Сентября, 2017 - 19:21:21
Post Id


Новичок


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


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




Все пытаются объяснить мне как работает функция extract()...

LIME, Кто вас так обманул?
1. Кто сказал вам что функция extract(), "сомнительная функция"? Посмотрите исходный код symfony, laravel или flight.
2. Кто сказал вам, что переменные переменных, считается плохой практикой? Мне интересно, как вы будете писать например: интерпретатор или транслятор, насколько "правильным" и "чистым" будет ваш код без применения "переменные переменных"...

Цитата:
тс пришел в пхп после js

Радость Ходячий шар, неверных предсказаний...

ВНИМАНИЕ! Ответ на вопрос (для тех, кому это было интересно):

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. foreach ($array as $key => $value)
  4. {
  5.   $$key= $value;
  6. }
  7. ?>
  8.  


Это код полностью идентичен вызову extract() с флагом EXTR_OVERWRITE, смотрим исходный код функции extract() на С. Нет необходимости использовать unset().

Наверное, правила данного форум, запрещают давать дельные ответы...

(Отредактировано автором: 16 Сентября, 2017 - 19:25:39)

 
 Top
LIME
Отправлено: 16 Сентября, 2017 - 19:25:27
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




не путайте клиентский код с кодом инструментов
для пакетов это вполне приемлимо
для клиентского кода сомнительно
лучше задуматься о том что отвечают чем отвечать "сам дурак"
естественно можно и в цикле это делать
только зачем если есть уже сахар?
(Добавление)
пакеты ты не станешь читать
а вот твой код скорее всего станут читать
работа прогера в большей степени это чтение
(Добавление)
сахар - это термин
(Добавление)
re2enX пишет:
ВНИМАНИЕ! Ответ на вопрос (для тех, кому это было интересно):
сомневаюсь что такие найдуться идо решение простое как табуретка
гораздо сложнее понять что в нем плохого чем додуматься до него))
удачи в прогрессе)
 
 Top
re2enX
Отправлено: 16 Сентября, 2017 - 19:37:32
Post Id


Новичок


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


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




LIME
Спойлер (Отобразить)
И вам удачи! Радость

(Отредактировано автором: 16 Сентября, 2017 - 19:38:16)

 
 Top
LIME
Отправлено: 16 Сентября, 2017 - 19:45:54
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




ого
сколько всего хорошего по ссыле %сарказм%
не...хорошие штуки только не понимаю причем они к вопросу ну и какбэ в курсе...читал...использую
ну раз пошла такая пьянка рекомендую погуглить SOLID... если еще не в курсе конечно
все по ссылке это реализации его
спасибо за ссылку пригодится читателям) %не сарказм%
только не надо из этих штук делать религию
 
 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