结合instanceof和abstract来遍历对象。

jackxiang 2009-1-11 10:45 | |
instanceof 运算符是 PHP 5 引进的。在此之前用 is_a(),但是 is_a() 已经过时了,最好用 instanceof。
例子一:

<?php
class A { }
class B { }

$thing = new A;

if ($thing instanceof A) {
    echo 'A';
}
if ($thing instanceof B) {
    echo 'B';
}
?>

显示:A

例子二:
<?php
abstract class A { }
abstract class B extends A{ }
class C extends B{}
$thing = new C;

if ($thing instanceof A) {
    echo 'A';
}
if ($thing instanceof B) {
    echo 'B';
}
?>

显示:AB

参看下面代码用到上面的例子二在:   foreach($myCollection as $s)   ----》 if($s instanceof Shape) //如果$s是Shape类的实例
<?php
   //abstract root class 抽象根类
   abstract class Shape
   {
       abstract function getArea(); //定义一个抽象方法
   }

   //abstract child class 抽象子类
   abstract class Polygon extends Shape //多边形
   {
       abstract function getNumberOfSides();
   }

   //concrete class 实体类 三角形类
   class Triangle extends Polygon
   {
       public $base;
       public $height;

       public function getArea() //覆写计算面积方法
       {
           return(($this->base * $this->height)/2);
       }

       public function getNumberOfSides() //覆写边数统计方法
       {
           return(3);
       }
   }

   //concrete class 实体类四边形
   class Rectangle extends Polygon
   {
       public $width;
       public $height;

       public function getArea()
       {
           return($this->width * $this->height);
       }

       public function getNumberOfSides()
       {
           return(4);
       }
   }

   //concrete class 实体类 圆形
   class Circle extends Shape
   {
       public $radius;

       public function getArea()
       {
           return(pi() * $this->radius * $this->radius);
       }
   }

   //concrete root class 定义一个颜色类
   class Color
   {
       public $name;
   }

   $myCollection = array(); //建立形状的集合,放入数组

   //make a rectangle
   $r = new Rectangle;
   $r->width = 5;
   $r->height = 7;
   $myCollection[] = $r;
   unset($r);

   //make a triangle
   $t = new Triangle;
   $t->base = 4;
   $t->height = 5;
   $myCollection[] = $t;
   unset($t);

   //make a circle
   $c = new Circle;
   $c->radius = 3;
   $myCollection[] = $c;
   unset($c);

   //make a color
   $c = new Color;
   $c->name = "blue";
   $myCollection[] = $c;
   unset($c);

   foreach($myCollection as $s)
   {
       if($s instanceof Shape) //如果$s是Shape类的实例
       {
           print("Area: " . $s->getArea() .
               "<br>\n");
       }

       if($s instanceof Polygon)
       {
           print("Sides: " .
               $s->getNumberOfSides() .
               "<br>\n");
       }

       if($s instanceof Color)
       {
           print("Color: $s->name<br>\n");
       }

       print("<br>\n");
   }

?>

解释:
Shape:有一个取得面积的虚方法getArea,Polygon在继承了Shape的取得面积方法后添加了一个取得边数的方法getNumberOfSides,在下面的三角形四边形等都有边,继承重写Polygon(有边有面积),而圆形circle则只能是有面积没有几条边,直接继承了Shape和它的虚方法getArea,然后重写这个圆的面积计算方法。

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1589/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2009-1-11 11:02
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]