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 :: инициализация входящих данных [2]

 PHP.SU

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


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

> Описание: а как у вас?
OrmaJever Модератор
Отправлено: 15 Июля, 2014 - 20:16:48
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




итератор по сути то и придуман для foreach.
Ещё можно добавить один метод
PHP:
скопировать код в буфер обмена
  1.         public function __toString() {
  2.             return print_r($this->data, 1);
  3.         }

для


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DlTA
Отправлено: 15 Июля, 2014 - 20:21:34
Post Id



Постоянный участник


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


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




ну тогда не забудьте и про Countable interface
(Добавление)
Мелкий пишет:
$_SESSION['foo']['bar']

кстати есть же еще Recursiveiterator слабо представляю как это сдружить, но в теории должно получиться что то мощьное

(Отредактировано автором: 15 Июля, 2014 - 20:22:12)

 
 Top
teddy
Отправлено: 15 Июля, 2014 - 20:32:21
Post Id


Участник


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


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




Хм... вообще по сути этот класс можно заменить простым методом, при этом не перекрывая стандартные глобальные массивы, я думаю это плохо.

PHP:
скопировать код в буфер обмена
  1. function getData($arr, $key, $default = null)
  2. {
  3.     return ( isset($arr[$key]) and !empty($arr[$key]) ) ? $arr[$key] : $default;
  4. }
  5.  
  6. echo getData($_GET, 'mydata', 'default_value');


Только в этом случае мы получим notice, если обратимся как echo $_GET['not_defined_key'].
Но это уж простите, нужно отслеживать в коде, не перекрывая стандартные глобальные массивы PHP.

Мое скромное имхо... )
 
 Top
OrmaJever Модератор
Отправлено: 15 Июля, 2014 - 20:45:30
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Мелкий пишет:
А вот для сессии откровенно неудобно, см. $_SESSION['foo']['bar'] = 1;

шах и мат
PHP:
скопировать код в буфер обмена
  1.         public function offsetGet ( $offset ) {
  2.             if( isset($this->data[$offset]) ) {
  3.                 if( is_array( $this->data[$offset] ) ) {
  4.                     $this->data[$offset] = new self( $this->data[$offset] );
  5.                 }
  6.                 return $this->data[$offset];
  7.             } else {
  8.                 return null;
  9.             }
  10.         }


PHP:
скопировать код в буфер обмена
  1. $_SESSION['a']['b'] = 1;
  2. $_SESSION['b'] = 1;
  3.  
  4. echo $_SESSION['a']['c'];
  5. echo $_SESSION['b']['c'];

(Добавление)
хотя замеры скорости и памяти наверное не полюбят такую реализацию метода, но в своё оправдание могу сказать что обьект создаётся только когда есть обращение к ключу Улыбка


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DlTA
Отправлено: 16 Июля, 2014 - 00:15:47
Post Id



Постоянный участник


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


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




OrmaJever пишет:
шах и мат
но надо добавить сноску 5.4+
 
 Top
OrmaJever Модератор
Отправлено: 16 Июля, 2014 - 00:50:29
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




DlTA А?! почему?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DlTA
Отправлено: 16 Июля, 2014 - 00:52:06
Post Id



Постоянный участник


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


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




ошибся, спутал с результатом возврата функции, а там разыменование появилось с 5.4
 
 Top
Мелкий Супермодератор
Отправлено: 16 Июля, 2014 - 09:45:31
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




OrmaJever, я читаю все темы. Если ничего не ответил - значит или ещё не прочитал или сказать нечего Подмигивание Чаще второе.
Хороший вариант. Не догадался.
Осталось session_start перекинуть в класс сессий - чтобы сессия стартовала только при попытке что-то в сессию записать (при чтении - стартовать сессию только с условием существования $_COOKIE[session_name()] или $_GET[session_name()])


-----
PostgreSQL DBA
 
 Top
DlTA
Отправлено: 16 Июля, 2014 - 09:52:10
Post Id



Постоянный участник


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


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




Мелкий пишет:
OrmaJever, я читаю все темы. Если ничего не ответил - значит или ещё не прочитал или сказать нечего Чаще второе.
это к этой теме?
 
 Top
OrmaJever Модератор
Отправлено: 16 Июля, 2014 - 11:48:54
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Мелкий пишет:
Осталось session_start перекинуть в класс сессий - чтобы сессия стартовала только при попытке что-то в сессию записать (при чтении - стартовать сессию только с условием существования $_COOKIE[session_name()] или $_GET[session_name()])

ну это по-моему лишнее, лично я всегда стартую сесию в начале скриптов даже если пока её не использую Улыбка
В итоге после всех доработок класс выглядит так
Спойлер (Отобразить)


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DlTA
Отправлено: 16 Июля, 2014 - 11:54:28
Post Id



Постоянный участник


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


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




OrmaJever пишет:
public function __construct(&$var) {
        $this->data = $var;
это для экономии памяти передается по указателю, а потом копируется, или тут ошибка и хотели сделать $this->data = &$var; ?
 
 Top
OrmaJever Модератор
Отправлено: 16 Июля, 2014 - 15:24:21
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




пошёл проверять, был уверен что амперсанд нужен и в параметре и при присвоении, но результаты потребления памяти меня поразили.
PHP:
скопировать код в буфер обмена
  1.         public function __construct($var) {
  2.             $this->data = &$var;
  3.         }
  4. // 1184 байта
  5.         public function __construct(&$var) {
  6.             $this->data = $var;
  7.         }
  8. // 1192 байта
  9.         public function __construct(&$var) {
  10.             $this->data = &$var;
  11.         }
  12. // php упал o_O
  13.         public function __construct($var) {
  14.             $this->data = $var;
  15.         }
  16. // 456(!!!) байт

получается без ссылок ещё и меньше памяти потребляет А?!


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DlTA
Отправлено: 16 Июля, 2014 - 17:41:29
Post Id



Постоянный участник


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


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




мои результаты вроде корректней и логичней выглядят
Спойлер (Отобразить)

можно сделать вывод что указатель/ссылка, довольно таки прожорливая штука

а еще что пыха пытается без особой надобности не добавлять данные в память, если с ними ничего не делают
это видно по модифицированному коду:
Спойлер (Отобразить)

ps для чистоты эксперемента, при тестировании каждого из классов остальные коментировались

(Отредактировано автором: 16 Июля, 2014 - 17:43:23)

 
 Top
teddy
Отправлено: 16 Июля, 2014 - 20:29:20
Post Id


Участник


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


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




OrmaJever
Хм... Countable? А зачем он нужен в этом контексте? Вдруг нужно получить количество всех элементов в многомерном массиве? Этого сделать уже не получится. Нельзя будет передать флаг в метод, который возвращал бы кол-во элементов рекурсивно(в итерфейсе флаг не описан).

PHP:
скопировать код в буфер обмена
  1. public function count($recursive = false)
  2. {
  3.     return $recursive ? count($this->data, COUNT_RECURSIVE) : count($this->data);
  4. }

Я об этом... + ко всему ещё одна отравляющая очевидность:
$_GET, $_POST и остальные глобальные массивы перестают быть массивами при таком использовании, тем самым мы теряем возможность применять к ним функции для работы с массивами.

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

(Отредактировано автором: 16 Июля, 2014 - 20:33:12)

 
 Top
OrmaJever Модератор
Отправлено: 16 Июля, 2014 - 20:36:11
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




teddy пишет:
Вдруг нужно получить количество всех элементов в многомерном массиве

как бы это глупо не звучало, но за все годы что я знаю php я даже не догадывался про существование второго параметра в функции count, наверное он и не нужен Улыбка
teddy пишет:
Велосипеды должны упрощать работу, но никак не урезать возможности языка.

это было самое первое моё требование к этому классу, и как показала практика мне удалось добиться того что например стандартный $_GET и обьект $_GET моего класса практически не отличаются по использованию. Да есть мелкие особенности, но они либо терпимы либо очень редко используемы.
Опять же на любителя, я просто показал способ избавиться от нотисов, а использовать его или нет это уже дело каждого.
(Добавление)
DlTA увы, но совсем ссылки использовать в этом классе нельзя (и в параметре и в присвоении)

из-за того что имя нового обьекта такое же как и у самого массива, то при присвоении уходим в рекурсию
PHP:
скопировать код в буфер обмена
  1. $_GET = new request($_GET);
  2. $_GET['a'] = 1;

Поэтому как показали тесты лучше вообще не использовать ссылку.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB