Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Рабочая тетрадь(4)

.pdf
Скачиваний:
36
Добавлен:
10.02.2016
Размер:
7 Мб
Скачать
☆

ArrayAccess

boolean offsetExists ( mixed $offest )

mixed offsetGet ( mixed $offest )

void offsetSet ( mixed $offest, mixed $value)

void offsetUnset ( mixed $offest )

Идея

$obj = new MyClass;

echo $obj["one"];

unset($obj["two"]);

$obj["three"] = "Какое-то значение";

IteratorAggregate extends Traversable

public Traversable getIterator ( void )

class myData implements IteratorAggregate {

public $property1 = "one"; public $property2 = "two"; public function __construct() {

$this->last_property = "last property";

}

public function getIterator() {

// return объект класса, наследник интерфейса Iterator

}

}

$obj = new myData;

foreach($obj as $key => $value) {

var_dump($key, $value); echo "\n";

}

ArrayIterator implements Iterator,Traversable, ArrayAccess, SeekableIterator, Countable, Serializable

Создание итератора из массива

$it = new ArrayIterator(array(3, 2, 1));

foreach ($it as $value) {

echo $value . " "; // 3 2 1

$it -> rewind();

$it -> asort();

foreach ($it as $value)

echo $value . " "; // 1 2 3 $it -> count();

Лабораторная работа 2.2

Использование интерфейса IteratorAggregate и класса

ArrayIterator

Упражнение 1: Изменение основного класса проекта

•В текстовом редакторе откройте файл news\NewsDB.class.php

•Добавьте в качестве "родителя" класса NewsDB интерфейс IteratorAggregate

•Добавьте закрытое свойство _items и присвойте ему значение по умолчанию пустой массив

•Создайте и закрытый метод getCategories()

•Опишите метод getCategories():

◦получить значение полей id и name из таблицы category базы данных news.db

◦заполнить свойство _items как:

■ключи элементов массива соответствуют значениям поля id

■значения элементов массива соответствуют значениям поля name

•В конструкторе класса вызовите метод getCategories()

•Создайте и опишите метод getIterator()

•Метод getIterator() должен возвращать экземпляр класса ArrayIterator, в конструктор которого необходимо передать в качестве аргумента свойство _items

•Сохраните файл news\NewsDB.class.php

Упражнение 2: Использование класса в качестве итератора

•В текстовом редакторе откройте файл news\news.php

•В HTML-коде удалите все между тэгами <select></select>

•В цикле foreach отрисуйте HTML-список используя объект $news в качестве итератора

•Сохраните файл news\news.php

•Запустите браузер и в адресной строке наберите http://mysite.local/news/news.php

•Вы не должны увидеть каких-либо изменений по сравнению с предыдущими запусками

•Убедитесь, что список категорий отобразился корректно

class Obj implements Serializable { private $data;

public function __construct() { $this->data = "My private data";

}

public function serialize() { return serialize($this->data);

}

public function unserialize($data) { $this->data = unserialize($data);

}

public function getData() { return $this->data;

}

}

ArrayIterator

AppendIterator

DirectoryIterator

FilterIterator

InfiniteIterator

IteratorIterator

LimitIterator

NoRewindIterator

RecursiveIterator

…

RecursiveArrayIterator extends ArrayIterator

implements RecursiveIterator RecursiveIteratorIterator implements OuterIterator,

Traversable, Iterator

$arr = array(1, array(2, array(3)), array(4));

$it = new RecursiveArrayIterator($arr);

$rit = new RecursiveIteratorIterator($it);

foreach ($rit as $key => $value) {

$d = $rit -> getDepth();

echo "d=$d k=$key v=$value; ";

}

// d=0 k=0 v=1; d=1 k=0 v=2; d=2 k=0 v=3; d=1 k=0 v=4;

abstract FilterIterator extends IteratorIterator

implements OuterIterator, Traversable, Iterator

class MyClass extends FilterIterator{ public function accept() {

return $this->getInnerIterator()->current() > 5;

}

}

$arr = array(5, 2, 7, 1, 9, 3, 6, 8);

$it = new ArrayIterator($arr);

$fit = new MyClass($it);

foreach ($fit as $value)

echo $value . " "; // 7 9 6 8

LimitIterator extends IteratorIterator

implements OuterIterator, Traversable, Iterator

$arr = array(1, 2, 3, 4, 5, 6, 7, 8);

$it = new LimitIterator($arr, 2, 4);

foreach ($it as $value)

echo $value . " "; // 3 4 5 6

InfiniteIterator extends IteratorIterator implements OuterIterator,

Traversable, Iterator

class Obj {

public function __construct($flag) { $this->flag = $flag;

}

public function doIt() {

echo "Done"; return $this->flag;

}

}

$o1 = $o2 = new Obj(true); $o3 = new Obj(false);

$at = new ArrayIterator(array($o1, $o2, $o3));

$it = new InfiniteIterator($at);

foreach ($it as $o)

$r = $o -> doIt(); if(!$r) break;