За последние 24 часа нас посетили 40753 программиста и 1725 роботов. Сейчас ищут 623 программиста ...

ArrayAccess

Тема в разделе "PHP для новичков", создана пользователем Alex_1984, 14 сен 2015.

  1. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    Есть массив:
    Код (Text):
    1. array (size=32)
    2.   0 =>
    3.     object(user_model)[12]
    4.       private 'container' (model) =>
    5.         array (size=7)
    6.           'id' => string '11' (length=2)
    7.           'login' => string 'zxc' (length=3)
    8.           'name' => string 'zxc' (length=3)
    9.           'email' => string 'asd@sad.ru' (length=10)
    10.           'password' => string '$2y$10$SF5UZBbJnyJdRuNN6Z7kzO51FKioArN/GRrS6ZtoRivrjpCImdbWm' (length=60)
    11.           'role_id' => string '1' (length=1)
    12.           'role_name' => string 'admin' (length=5)
    13.   1 =>
    14.     object(user_model)[13]
    15.       private 'container' (model) =>
    16.         array (size=7)
    17.           'id' => string '12' (length=2)
    18.           'login' => string 'йцу' (length=6)
    19.           'name' => string 'йцу' (length=6)
    20.           'email' => string 'asd@sad.ru' (length=10)
    21.           'password' => string '$2y$10$smY4xMpUqSqOkEd3/GT4g.8CUO0A1/7lZ79szV0y4Ds36D/ANqLzq' (length=60)
    22.           'role_id' => string '1' (length=1)
    23.           'role_name' => string 'admin' (length=5)
    24.   2 =>
    25.     object(user_model)[14]
    26.       private 'container' (model) =>
    27.         array (size=7)
    28.           'id' => string '13' (length=2)
    29.           'login' => string 'zsd' (length=3)
    30.           'name' => string 'asd' (length=3)
    31.           'email' => string 'asd@sad.ru' (length=10)
    32.           'password' => string '$2y$10$HCTbW8lWn1Pse3KSJ36ek.dyQAH1NTw1Y/pEZ4WIW391/euqqt7Wy' (length=60)
    33.           'role_id' => string '1' (length=1)
    34.           'role_name' => string 'admin' (length=5)
    35.   3 =>
    36.     object(user_model)[15]
    37.       private 'container' (model) =>
    38.         array (size=7)
    39.           'id' => string '14' (length=2)
    40.           'login' => string 'ad' (length=2)
    41.           'name' => string 'adf' (length=3)
    42.           'email' => string 'asd@sad.ru' (length=10)
    43.           'password' => string '$2y$10$vilVyP4VuWwBfgrs4TQfLu9hfXvLzbGrXTH5UdrisDYJ.QqHSNr5u' (length=60)
    44.           'role_id' => string '1' (length=1)
    45.           'role_name' => string 'admin' (length=5)
    находится он в переменной $users

    Код (PHP):
    1.         foreach($users as $user)
    2.         {
    3.             var_dump($user); /* здесь выводится object(user_model)[12]
    4.                                                                      private 'container' (model) => array (size=7)
    5.                                                                      'id' => string '11' (length=2)
    6.                                                                      'login' => string 'zxc' (length=3)
    7.                                                                      'name' => string 'zxc' (length=3)
    8.                                                                      'email' => string 'asd@sad.ru' (length=10)
    9.                                                                      'password' => string '$2y$10$SF5UZBbJnyJdRuNN6Z7kzO51FKioArN/GRrS6ZtoRivrjpCImdbWm' (length=60)
    10.                                                                      'role_id' => string '1' (length=1)
    11.                                                                      'role_name' => string 'admin' (length=5) */
    12.  
    13.             foreach($user as $key => $val)
    14.             {
    15.                 echo $key.'  ======>  '.$val; // здесь не выводится ничего, ошибки тоже нет
    16.             }
    17.         }
    собственно вопрос почему второй foreach не работает
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    потому что итератор не работает с приватными свойствами объекта?
     
  3. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    т.е. container из arrayaccess публичным сделать?

    и почему ошибки никакой нет?
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а почему ошибка должна быть? попробуй напрямую обратиться - будет. а так - итератор получает список публичных свойство объекта - пустоту - и итерируется по ней - ноль раз. всё как и должно быть.
    кстати если бы оно и было публичным то цикл выполнялся бы единожды потому что в дампе же видно что там только одно (хоть и приватное) свойство которое уже в свою очередь является массивом.
     
  5. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    тогда не понимаю как arrayaccess пользоваться, проще с обычными массивами сделать
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Класс должен реализовывать ArrayAccess, если вы хотите, чтоб его экземпляры можно было индексировать. Вот простейший пример из моей практики: класс Config отвечает за то, чтобы считать настройки из базы данных. А потом для получения доступа к конкретной настройки его можно просто проиндексировать:
    Код (PHP):
    1. $max_post_len = $app->config["max_post_len"];
    2.  
    3. // вместо
    4. $max_post_len = $app->config->getOption("max_post_len");
    5.  
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    "Hello world!" проще, чем facebook, нахуа тогда фейсбук?! )))

    Интерфейсы полезны там, где действительно надо абстрагироваться от конкретной реализации. То есть, упрощенно говоря, когда у тебя есть несколько классов с одним интерфейсом. И этот интерфейс реально помогает выполнять некие общие для всех имплементаций действия.
    А пока класс один и не предполагается расширение, всё это выглядит как пустая трата времени и букв.

    Добавлено спустя 3 минуты 37 секунд:
    Кстати, самый простой способ внедрения ArrayAccess в проект — наследовать свой класс от ArrayIterator, который уже реализует ArrayAccess и другие вкусные интерфейсы.
     
  8. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    это и должно было быть класс class model implements ArrayAccess и от него class user_model extends model

    забираем из базы
    Код (PHP):
    1. <span class="syntaxdefault"><br />    function get_res</span><span class="syntaxkeyword">()<br /></span><span class="syntaxdefault">    </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">        $model_arr </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">[];<br /><br /></span><span class="syntaxdefault">        foreach</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">prepared</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">fetchAll</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">PDO</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">FETCH_NAMED</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> as $arr</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">        </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">            $model </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> new user_model</span><span class="syntaxkeyword">();<br /></span><span class="syntaxdefault">            foreach</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$arr as $key </span><span class="syntaxkeyword">=></span><span class="syntaxdefault"> $val</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">            </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">                $model</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">$key</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $val</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">            </span><span class="syntaxkeyword">}<br /><br /></span><span class="syntaxdefault">            array_push</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$model_arr</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $model</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">        </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">        return $model_arr</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">    </span><span class="syntaxkeyword">}<br />&nbsp;</span><span class="syntaxdefault"></span>
    все заполняется, а вот обратно никак))

    может заполняю неправильно?
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    http://phpfaq.ru/debug

    Добавлено спустя 7 минут 26 секунд:
    "Правильно"/"неправильно" зависит от цели. Я не понимаю смысла этой конструкции. Что ты хочешь вернуть? Массив объектов типа ArrayAccess. Я не вижу в этом смысла. Можешь пояснить?

    Покажи как ты хочешь использовать результат. Тогда будет видно что именно "неправильно".

    Добавлено спустя 12 минут 3 секунды:
    Кстати, посмотри описание метода PDOStatement::fetch с параметрами PDO::FETCH_CLASS или PDO::FETCH_INTO. Помоему сама цель не айс, но эти штуки делают в точности то, чего ты хочешь, вроде бы.
     
  10. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    я хотел массив классов к которым можно обращаться как к массиву
    не $users[0]->id а $users[0]['id'] для того чтобы их можно было перебрать в цикле как в первом посте. собственно с arrayIterator массив получается как раз такой какой мне и нужен.

    с PDO::FETCH_INTO тоже попробую, похоже на то что нужно

    ЗЫ изначально целью было реализовать DataMapper, но сейчас у меня модель никуда не вписывается, классы моделей пустые т.е. есть класс model который реализует ArrayAccess и модели типа такой
    Код (PHP):
    1. <span class="syntaxdefault"><br /></span><span class="syntaxkeyword">class&nbsp;</span><span class="syntaxdefault">user_model&nbsp;</span><span class="syntaxkeyword">extends&nbsp;</span><span class="syntaxdefault">model<br /></span><span class="syntaxkeyword">{<br />}<br />&nbsp;</span><span class="syntaxdefault"></span>
    отсюда в маппере и берется заполнение массива объектами класса user_model

    наверно я делаю что то не так ))
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    И как arrayaccess приближает тебя к datamapper? Я вижу только лишнюю зависимость. В то время как идея маппера в том, чтобы не накладывать на доменный объект никаких зависимостей.
     
  12. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    ну я вообще думал что маппер нужен что бы отделить источник данных от модели, т.е. при изменении или добавлении источника данных нужно будет написать новый маппер, а модель как была так и останется и из какого источника ее будут заполнять ей без разницы
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Зачем тебе arrayaccess здесь?
     
  14. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
     
  15. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    Ладно, согласен, не нужен. Что тогда в моделях должно быть?