Home >Backend Development >PHP Tutorial >Introduction to the 6 predefined interfaces in PHP_PHP Tutorial

Introduction to the 6 predefined interfaces in PHP_PHP Tutorial

WBOY
WBOYOriginal
2016-07-13 09:53:41858browse

Introduction to the 6 predefined interfaces in PHP

This article mainly introduces the introduction to the 6 predefined interfaces in PHP. This article explains Traversable, Iterator, IteratorAggregate, and ArrayAccess , Serializable, Closure, friends in need can refer to it

PHP predefined 6 interfaces are introduced as follows:

 1.Traversable traversal interface

Haha! In fact, it is not an interface that can be used in PHP. Only internal classes can be used. One of its uses is to detect whether a class can be traversed.

 ?

1

2

3

if($class instanceof Traversable) {

//foreach

}

1

2

3

1

2

3

4

5

6

7

8

9

10

11

12

13

Iterator extends Traversable

{

//返回当前索引游标指向的元素

abstract public mixed current(void)

//返回当前索引游标指向的元素的键名

abstract public scalar key(void)

//移动当前索引游标指向下一元素

abstract public void next(void)

//重置索引游标的指向第一个元素

abstract public void rewind(void)

//判断当前索引游标指向的是否是一个元素,常常在调用 rewind()或 next()使用

abstract public boolean valid(void)

}

if($class instanceof Traversable) { //foreach }
 2.Iterator interface Interface summary:  ?
1 2 3 4 5 6 7 8 9 10 11 12 13 Iterator extends Traversable { //Return the element pointed to by the current index cursor abstract public mixed current(void) //Returns the key name of the element pointed to by the current index cursor abstract public scalar key(void) //Move the current index cursor to point to the next element abstract public void next(void) //Reset the index cursor to point to the first element abstract public void rewind(void) //Determine whether the current index cursor points to an element, often used when calling rewind() or next() abstract public boolean valid(void) }

The above allows a class to implement a basic iteration function. You can see the calling sequence of iteration as follows:

 ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

class myIterator implements Iterator {

private $position = 0 ;

private $array = array(

"firstelement" ,

"secondelement" ,

"lastelement" ,

);

 

public function __construct () {

$this -> position = 0 ;

}

 

function rewind () {

var_dump ( __METHOD__ );

$this -> position = 0 ;

}

 

function current () {

var_dump ( __METHOD__ );

return $this -> array [ $this -> position ];

}

 

function key () {

var_dump ( __METHOD__ );

return $this -> position ;

}

 

function next () {

var_dump ( __METHOD__ );

$this -> position ;

}

 

function valid () {

var_dump ( __METHOD__ );

return isset( $this -> array [ $this -> position ]);

}

}

 

$it = new myIterator ;

 

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

var_dump ( $key , $value );

echo "n" ;

}

1

2

3

4

1

2

3

4

5

IteratorAggregate extends Traversable {

 

//获取外部迭代器

abstract public Traversable getIterator ( void )

}

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
class myIterator implements Iterator { private $position = 0 ; private $array = array( "firstelement" , "secondelement" , "lastelement" , ); public function __construct () { $this -> position = 0 ; } function rewind () { var_dump ( __METHOD__ ); $this -> position = 0 ; } function current () { var_dump ( __METHOD__ ); return $this -> array [ $this -> position ]; } function key () { var_dump ( __METHOD__ ); return $this -> position ; } function next () { var_dump ( __METHOD__ ); $this -> position ; } function valid () { var_dump ( __METHOD__ ); return isset( $this -> array [ $this -> position ]); } } $it = new myIterator ; foreach( $it as $key => $value ) { var_dump ( $key , $value ); echo "n" ; }
 3.IteratorAggregate aggregated iterator interface Interface summary:  ?
1 2 3 4 5 IteratorAggregate extends Traversable { //Get external iterator abstract public Traversable getIterator ( void ) }

 getIterator is an instance of a class of Iterator or Traversable interface. Obtain the external iterator as follows to implement iterative access.

 ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

class myData implements IteratorAggregate {

public $property1 = "Public property one" ;

public $property2 = "Public property two" ;

public $property3 = "Public property three" ;

 

public function __construct () {

$this -> property4 = "last property" ;

}

 

 

public function getIterator () {

return new ArrayIterator ( $this );

}

}

 

$obj = new myData ;

 

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

var_dump ( $key , $value );

echo "n" ;

}

1

2

3

4

1

2

3

4

5

6

7

ArrayAccess {

/* 方法 */

abstract public boolean offsetExists ( mixed $offset ) //检查偏移位置是否存在

abstract public mixed offsetGet ( mixed $offset ) //获取一个偏移位置的值

abstract public void offsetSet ( mixed $offset , mixed $value ) //设置一个偏移位置的值

abstract public void offsetUnset ( mixed $offset ) //复位一个偏移位置的值

}

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
class myData implements IteratorAggregate { public $property1 = "Public property one" ; public $property2 = "Public property two" ; public $property3 = "Public property three" ; public function __construct () { $this -> property4 = "last property" ; } public function getIterator () { return new ArrayIterator ( $this ); } } $obj = new myData ; foreach( $obj as $key => $value ) { var_dump ( $key , $value ); echo "n" ; }
 4.ArrayAccess array access interface Interface summary:  ?
1 2 3 4 5 6 7 ArrayAccess { /* Method */ abstract public boolean offsetExists (mixed $offset) //Check whether the offset position exists abstract public mixed offsetGet ( mixed $offset ) //Get the value of an offset position abstract public void offsetSet ( mixed $offset , mixed $value ) //Set the value of an offset position abstract public void offsetUnset (mixed $offset) //Reset the value of an offset position }

The object can be accessed like an array as follows:

 ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

class obj implements arrayaccess {

private $container = array();

public function __construct () {

$this -> container = array(

"one" => 1 ,

"two" => 2 ,

"three" => 3 ,

);

}

public function offsetSet ( $offset , $value ) {

if ( is_null ( $offset )) {

$this -> container [] = $value ;

} else {

$this -> container [ $offset ] = $value ;

}

}

public function offsetExists ( $offset ) {

return isset( $this -> container [ $offset ]);

}

public function offsetUnset ( $offset ) {

unset( $this -> container [ $offset ]);

}

public function offsetGet ( $offset ) {

return isset( $this -> container [ $offset ]) ? $this -> container [ $offset ] : null ;

}

}

 

$obj = new obj ;

 

var_dump (isset( $obj [ "two" ]));

var_dump ( $obj [ "two" ]);

unset( $obj [ "two" ]);

var_dump (isset( $obj [ "two" ]));

$obj [ "two" ] = "A value" ;

var_dump ( $obj [ "two" ]);

$obj [] = 'Append 1' ;

$obj [] = 'Append 2' ;

$obj [] = 'Append 3' ;

print_r ( $obj );

1

2

3

4

1

2

3

4

5

6

Serializable {

 

/* 方法 */

abstract public string serialize ( void ) //对象的字符串表示

abstract public mixed unserialize ( string $serialized ) // 构造对象

}

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
class obj implements arrayaccess { private $container = array(); public function __construct () { $this -> container = array( "one" => 1 , "two" => 2 , "three" => 3 , ); } public function offsetSet ( $offset , $value ) { if ( is_null ( $offset )) { $this -> container [] = $value ; } else { $this -> container [ $offset ] = $value ; } } public function offsetExists ( $offset ) { return isset( $this -> container [ $offset ]); } public function offsetUnset ( $offset ) { unset( $this -> container [ $offset ]); } public function offsetGet ( $offset ) { return isset( $this -> container [ $offset ]) ? $this -> container [ $offset ] : null ; } } $obj = new obj ; var_dump (isset( $obj [ "two" ])); var_dump ( $obj [ "two" ]); unset( $obj [ "two" ]); var_dump (isset( $obj [ "two" ])); $obj [ "two" ] = "A value" ; var_dump ( $obj [ "two" ]); $obj [] = 'Append 1' ; $obj [] = 'Append 2' ; $obj [] = 'Append 3' ; print_r ( $obj );
 5.Serializable serialization interface Interface summary:  ?
1 2 3 4 5 6 Serializable { /* Method */ abstract public string serialize (void) //String representation of the object abstract public mixed unserialize ( string $serialized ) // Construct object }

Classes that implement this interface no longer support __sleep() and __wakeup(). Usage is very simple, as long as the serialize method is called when the object is serialized, and the unserialize method is called when deserializing.

 ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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 ;

}

}

 

$obj = new obj ;

$ser = serialize ( $obj );

print_r($ser);

$newobj = unserialize ( $ser );

print_r($newobj);

1

2

3

4

1

2

3

4

5

6

Closure {

/* 方法 */

__construct ( void ) //用于禁止实例化的构造函数

public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] ) //复制一个闭包,绑定指定的$this对象和类作用域。

public Closure bindTo ( object $newthis [, mixed $newscope = 'static' ] ) //复制当前闭包对象,绑定指定的$this对象和类作用域。

}

5

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

class A {

private static $sfoo = 1 ;

private $ifoo = 2 ;

}

$cl1 = static function() {

return A :: $sfoo ;

};

$cl2 = function() {

return $this -> ifoo ;

};

 

$bcl1 = Closure :: bind ( $cl1 , null , 'A' );

$bcl2 = Closure :: bind ( $cl2 , new A (), 'A' );

echo $bcl1 (), "n" ;

echo $bcl2 (), "n" ;

6 7

89 10 11 12 13 14
15
16
17 18 19 20 21
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 ; } } $obj = new obj ; $ser = serialize ( $obj ); print_r($ser); $newobj = unserialize ( $ser ); print_r($newobj);
 6.Closure Interface summary:  ?
1 2 3 4 5 6 Closure { /* Method */ __construct (void) //Constructor used to prohibit instantiation public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] ) //Copy a closure and bind the specified $this object and class scope. public Closure bindTo ( object $newthis [, mixed $newscope = 'static' ] ) //Copy the current closure object and bind the specified $this object and class scope. }
 ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class A { private static $sfoo = 1 ; private $ifoo = 2 ; } $cl1 = static function() { return A :: $sfoo ; }; $cl2 = function() { return $this -> ifoo ; }; $bcl1 = Closure :: bind ( $cl1 , null , 'A' ); $bcl2 = Closure :: bind ( $cl2 , new A (), 'A' ); echo $bcl1 (), "n" ; echo $bcl2 (), "n" ;
http://www.bkjia.com/PHPjc/1000103.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/1000103.htmlTechArticleIntroduction to the 6 predefined interfaces in PHP This article mainly introduces the introduction to the 6 predefined interfaces in PHP ,This article explains Traversable, Iterator, IteratorAggregate, ArrayAccess, Serializa...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn