Pro PHP Programning之接口、迭代器和抽象类

接口、迭代器和抽象类

接口是一个描述一整套方法的对象,某类可能要选择其中的方法去实现。

接口如下所示:

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方法,不能重载,只能那么用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值