тут http://php.ru/manual/class.iterator.html есть пример Я не могу понять, почему в примере например function rewind() это встроенный интерфейс итератора. Это же обычная функция которую нужно создавать для объекта или там есть еще что-то скрытое? Код (PHP): <?php class myIterator implements Iterator { private $position = 0; private $array = array( "firstelement", "secondelement", "lastelement", ); public function __construct() { $this->position = 0; } function rewind() { $this->position = 0; } } ... } ?>
немного переформулирую вопрос что мешает переименовать функцию rewind() на например start_new(). если ничего не мешает, то зачем вообще тогда писать в мануале про какие-то предопределенные интерфейсы. Зачем их сделали, если их код прописывается в каждом объекте. Вот например __construct() нельзя переименовать, т.к. php знает, что эта функция запускается при создании объекта. А в чем уникальность названия rewind(), какие у него скрытые возможности для языка или это просто застолбили название, чтобы все называли одинаково функции со схожими возможностями? аналогично про current, key, next, valid в примере. Т.е. я пытаюсь понять зачем использовать эти интерфейсы с такими названиями (которые все равно нужно описывать), а не писать свои функции.
Когда то читал книгу по C++ там про эти писали, забыл как это по научному называется, что бы в разных классах методы которые выполняют одно и то же действие (по логике) назывались одинаково, типа pop, push и т.д. кстати это однообразие потом помогает самописные вещи прогонять через встроенные функции, например в C# самописный связанный список через встроенный цикл foreach и т.д. ибо он он получает элемент обращаясь к нему через конкретный метод, а не как то еще.
Полиморфизм Объясни предназначение интерфейсов, абстрактных классов. Я как вижу ты либо вообще не читал либо читал и ничего не понял.
php_user, вы не поняли самого главного про интерфейс Iterator! Объекты класса, реализующего данный интерфейс, можно использовать в foreach как обычные массивы. Поэтому и нужны все эти функции, и поэтому они должны называться именно как в интерфейсе, а никак иначе, поскольку эти функции интерпретатор php вызывает автоматически, скрытно от глаз пользователя, когда вы используете объект вашего класса в цикле foreach
Интерфейс не содержит функций. Когда ты имплементируешь интерфейс итератор к своему классу, в нем не появляются функции. Наличие интерфейса на классе лишь гарантирует, что программист описал в нем все нужные функции, потому что иначе возникает фатальная ошибка.