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
Форумы портала PHP.SU :: Версия для печати :: инициализация входящих данных [2]
Форумы портала PHP.SU » » Вопросы новичков » инициализация входящих данных

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

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

для
17. DlTA - 15 Июля, 2014 - 20:21:34 - перейти к сообщению
ну тогда не забудьте и про Countable interface
(Добавление)
Мелкий пишет:
$_SESSION['foo']['bar']

кстати есть же еще Recursiveiterator слабо представляю как это сдружить, но в теории должно получиться что то мощьное
18. teddy - 15 Июля, 2014 - 20:32:21 - перейти к сообщению
Хм... вообще по сути этот класс можно заменить простым методом, при этом не перекрывая стандартные глобальные массивы, я думаю это плохо.

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.

Мое скромное имхо... )
19. OrmaJever - 15 Июля, 2014 - 20:45:30 - перейти к сообщению
Мелкий пишет:
А вот для сессии откровенно неудобно, см. $_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'];

(Добавление)
хотя замеры скорости и памяти наверное не полюбят такую реализацию метода, но в своё оправдание могу сказать что обьект создаётся только когда есть обращение к ключу Улыбка
20. DlTA - 16 Июля, 2014 - 00:15:47 - перейти к сообщению
OrmaJever пишет:
шах и мат
но надо добавить сноску 5.4+
21. OrmaJever - 16 Июля, 2014 - 00:50:29 - перейти к сообщению
DlTA А?! почему?
22. DlTA - 16 Июля, 2014 - 00:52:06 - перейти к сообщению
ошибся, спутал с результатом возврата функции, а там разыменование появилось с 5.4
23. Мелкий - 16 Июля, 2014 - 09:45:31 - перейти к сообщению
OrmaJever, я читаю все темы. Если ничего не ответил - значит или ещё не прочитал или сказать нечего Подмигивание Чаще второе.
Хороший вариант. Не догадался.
Осталось session_start перекинуть в класс сессий - чтобы сессия стартовала только при попытке что-то в сессию записать (при чтении - стартовать сессию только с условием существования $_COOKIE[session_name()] или $_GET[session_name()])
24. DlTA - 16 Июля, 2014 - 09:52:10 - перейти к сообщению
Мелкий пишет:
OrmaJever, я читаю все темы. Если ничего не ответил - значит или ещё не прочитал или сказать нечего Чаще второе.
это к этой теме?
25. OrmaJever - 16 Июля, 2014 - 11:48:54 - перейти к сообщению
Мелкий пишет:
Осталось session_start перекинуть в класс сессий - чтобы сессия стартовала только при попытке что-то в сессию записать (при чтении - стартовать сессию только с условием существования $_COOKIE[session_name()] или $_GET[session_name()])

ну это по-моему лишнее, лично я всегда стартую сесию в начале скриптов даже если пока её не использую Улыбка
В итоге после всех доработок класс выглядит так
Спойлер (Отобразить)
26. DlTA - 16 Июля, 2014 - 11:54:28 - перейти к сообщению
OrmaJever пишет:
public function __construct(&$var) {
        $this->data = $var;
это для экономии памяти передается по указателю, а потом копируется, или тут ошибка и хотели сделать $this->data = &$var; ?
27. OrmaJever - 16 Июля, 2014 - 15:24:21 - перейти к сообщению
пошёл проверять, был уверен что амперсанд нужен и в параметре и при присвоении, но результаты потребления памяти меня поразили.
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(!!!) байт

получается без ссылок ещё и меньше памяти потребляет А?!
28. DlTA - 16 Июля, 2014 - 17:41:29 - перейти к сообщению
мои результаты вроде корректней и логичней выглядят
Спойлер (Отобразить)

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

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

ps для чистоты эксперемента, при тестировании каждого из классов остальные коментировались
29. teddy - 16 Июля, 2014 - 20:29:20 - перейти к сообщению
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, но я б не рекомендовал перекрывать стандартные глобальные массивы.
30. OrmaJever - 16 Июля, 2014 - 20:36:11 - перейти к сообщению
teddy пишет:
Вдруг нужно получить количество всех элементов в многомерном массиве

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

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

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

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

 

Powered by ExBB FM 1.0 RC1