Максим Тимофеев: Если rules настроены криво - то да. В логине запрещены все спец символы по обыкновению. Но даже если и иначе то при регистрации надо проверять на unique оба этих поля, чтобы ваш сценарий не произошел. Так что тут дело не в этом коде, а в остальном.
Сергей: не знаю что у вас за странность, у меня всегда он работал во вьюхе, ну если налл, то у вас в переменной ничего нет. тогда уж if ($theuserinvoice !== NULL)
Stasgar: да, если вам надо чтобы элементами итератора были свойства вашего класса, то передавайте как в примере $this, если в классе есть уже массив, то передавайте его, $this->_dataArray, и уже по нему будет работать ваш суперитератор
Stasgar: она не сложная, просто надо вникнуть.
Конструктор внешнего итератора, то есть вы создаете еще один класс, который и будет вашим итератором, и в методе getIterator его отдаете, прим.:
public function getIterator() {
return new ВашКласс($this->attributes);
}
и вся дальнейшая работа итератора переходит в ВашКласс в конструкторе которого вы принимаете массив, и сохраняете там у себя в приватном свойстве и итерируете его например.
Stasgar: в методе getIterator мы отдаем другой экземпляр класса итератор, вы его можете определить сами, и в конструктор передается ваш массив для итерации. И вы получается работаете уже с другим классом.
Stasgar: ну да, можно так, по сути реализация этих классов/интерфейсов ничего не дает, вы можете сами определить методы в своем классе:
public function count();
public function serialize();
public function unserialize($sz);
Они лишь заставляют вас это сделать.
Stasgar: Нет, тут не реализуется ArrayAccess, который позволяет обратиться к объекту как к массиву, $obj['prop']; Не реализуется Countable, который позволяет посчитать кол-во элементов в вашем приватном массиве, не реализуется Serializable, для сериализации и десериализации вашего массива. Iterator это самый простой вариант, для перебора foreach'ем.
Stasgar: его работу можно сравнить с магическими методами, когда инстанс класса пытаются использовать как массив, он перехватывает эти методы и заставляет работать так, как нужно вам.
Сергей Беловенцев: с помощью xDebug можно ставить брик поинты в коде, и смотреть переменные, можно банально var_dump($token);exit(); можно выводить как отладочную информацию, Yii::trace('text');