За последние 24 часа нас посетили 53110 программистов и 1765 роботов. Сейчас ищут 1299 программистов ...

Интерфейс Iterator- зачем втроенный?

Тема в разделе "PHP для новичков", создана пользователем php_user, 26 июл 2014.

  1. php_user

    php_user Новичок

    С нами с:
    19 апр 2014
    Сообщения:
    91
    Симпатии:
    0
    тут http://php.ru/manual/class.iterator.html есть пример
    Я не могу понять, почему в примере например function rewind() это встроенный интерфейс итератора. Это же обычная функция которую нужно создавать для объекта или там есть еще что-то скрытое?
    Код (PHP):
    1. <?php
    2. class myIterator implements Iterator {
    3.     private $position = 0;
    4.     private $array = array(
    5.         "firstelement",
    6.         "secondelement",
    7.         "lastelement",
    8.     );  
    9.  
    10.     public function __construct() {
    11.         $this->position = 0;
    12.     }
    13.  
    14.     function rewind() {
    15.         $this->position = 0;
    16.     }
    17. }
    18. ...
    19. }
    20. ?>
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну наверное для того что бы сбросить счетчик не создавая новый объект класса.
     
  3. php_user

    php_user Новичок

    С нами с:
    19 апр 2014
    Сообщения:
    91
    Симпатии:
    0
    немного переформулирую вопрос
    что мешает переименовать функцию rewind() на например start_new(). если ничего не мешает, то зачем вообще тогда писать в мануале про какие-то предопределенные интерфейсы. Зачем их сделали, если их код прописывается в каждом объекте.
    Вот например __construct() нельзя переименовать, т.к. php знает, что эта функция запускается при создании объекта. А в чем уникальность названия rewind(), какие у него скрытые возможности для языка или это просто застолбили название, чтобы все называли одинаково функции со схожими возможностями?
    аналогично про current, key, next, valid в примере.
    Т.е. я пытаюсь понять зачем использовать эти интерфейсы с такими названиями (которые все равно нужно описывать), а не писать свои функции.
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Когда то читал книгу по C++ там про эти писали, забыл как это по научному называется, что бы в разных классах методы которые выполняют одно и то же действие (по логике) назывались одинаково, типа pop, push и т.д.
    кстати это однообразие потом помогает самописные вещи прогонять через встроенные функции, например в C# самописный связанный список через встроенный цикл foreach и т.д. ибо он он получает элемент обращаясь к нему через конкретный метод, а не как то еще.
     
  5. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Полиморфизм

    Объясни предназначение интерфейсов, абстрактных классов.
    Я как вижу ты либо вообще не читал либо читал и ничего не понял.
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    php_user, вы не поняли самого главного про интерфейс Iterator! Объекты класса, реализующего данный интерфейс, можно использовать в foreach как обычные массивы. Поэтому и нужны все эти функции, и поэтому они должны называться именно как в интерфейсе, а никак иначе, поскольку эти функции интерпретатор php вызывает автоматически, скрытно от глаз пользователя, когда вы используете объект вашего класса в цикле foreach
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Интерфейс не содержит функций. Когда ты имплементируешь интерфейс итератор к своему классу, в нем не появляются функции. Наличие интерфейса на классе лишь гарантирует, что программист описал в нем все нужные функции, потому что иначе возникает фатальная ошибка.