接口、迭代器和抽象类
接口是一个描述一整套方法的对象,某类可能要选择其中的方法去实现。
接口如下所示:
interface interf{
Public function f1($x,$y);
Public function f2(…);
Public function f3(…);
}
接口可以由其他接口继承而来,就像类一样。
Interface interf2 extendsinterf1{
Function f1(…);
}
【示例】:
<?PHP
Interface i1{
Public function f1($a );
}
Interface i2 extends i1{
Public functionf2($a);
}
Class c1 implements i2 {
Private $memb;
Function __construct($memb){
$this -> memb = $memb;
}
Function f2($x){
Printf(“Calling F2 on %s with arg: %s\n”,$this->memb,$x);
}
}
$x =new c1(“test”);
$x ->f2(‘a’);
?>
当运行这段代码时会提示一个错误,因为接口i1的函数f1没有定义。
迭代器是实现PHP内部接口(Iterator)的类的对象。定义接口Iterator如下所示:
Interface Iterator {
Public function rewind();//将迭代器倒回到第一个元素
Public function next();//向前移到下一个元素
Public function key();//返回当前元素的键
Public function current();//返回当前的元素
Public function valid();//检查当前的位置是否有效
}
实现接口Iterator的任何类都可以在for循环中使用,他们的对象被称为迭代器(Iterator).
【示例】:
实现接口Iterator的任何类都可以在for循环中使用
<?PHP
Class iter implements iterator{
Private $items;
Private $index = 0;
Function __construct(array $items){
$this ->items = $items;
}
Function __rewind(){
$this ->index = 0;
}
Function current(){
Return($this->items[$this->index]);
}
Function key(){
Return ($this->index);
}
Function next(){
$this ->index ++;
If(isset($this->items[$this->index])){
Return($this->items[$this->index]);
}else{
Return (NULL);
}
}
Function valid(){
Return(isset($this->items[$this->index]));
}
}
$x = new iter(range(‘A’,’D’));
Foreach($x as $key = > $val){
Print “key = $key\tvalue =$val\n”;
}
?>
【示例】实现接口Iterator
<?PHP
class file_iter implements iterator {
private $fp;
private $index = 0;
private $line;
function __construct($name){
$fp = fopen($name,"r");
if(!$fp){
die("Cannot open $name forreading.\n");
}
$this -> fp = $fp;
$this -> line =rtrim(fgets($this->fp),"\n");
}
function rewind(){
$this ->index= 0;
rewind($this->fp);
$this ->line =rtrim(fgets($this->fp),"\n");
}
function current(){
return ($this->line);
}
function key(){
return ($this->index);
}
function next(){
$this->index++;
$this->line =rtrim(fgets($this->fp),"\n");
if(!feof($this->fp)){
return ($this->line);
}else{
return (NULL);
}
}
function valid(){
return (feof($this->fp)?false:true);
}
}
$x= new file_iter("qdf.txt");
foreach($x as $lineno => $val){
print "$lineno"\t$val\n"";
}
?>
Rewind()函数不仅仅是迭代器接口里的一个方法名称,她还是一个操纵文件的核心函数,修改文件处理,指向文件的开头。
抽象类和接口的区别是什么?
两者都被当作是模板,其他类从而可以继承或实现他们,但是抽象类更加严格,结构定义也更加严格。除了抽象方法,抽象类可以有真正的成员和方法,甚至是final方法,不能重载,只能那么用。