第十九节:类与对象-Static关键字-抽象类和抽象方法-接口
Static关键字
声明类成员或者方法为static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)。
1 <?php 2 class Foo{ 3 public static $str=123; 4 static function bar(){ 5 echo "abv"; 6 } 7 } 8 var_dump(Foo::$str); 9 $foo=new Foo(); 10 var_dump($foo->str);// 输出为空 11 //$foo->bar(); 12 ?>
抽象类和抽象方法
当我有多个类使用同一个方法时,就使用抽象类,抽象类中可以不包括抽象方法。
1 <?php 2 abstract class Fruit{ 3 abstract protected function show_msg(); 4 } 5 class apple extends Fruit{ 6 private $name; 7 private $color; 8 function __construct($name,$color){ 9 $this->name=$name; 10 $this->color=$color; 11 } 12 function show_msg(){ 13 echo $this->color.$this->name; 14 } 15 } 16 //多个类需要使用同一个方法 17 class orange extend Fruit{ 18 private $name; 19 private $color; 20 function __construct($name,$color){ 21 $this->name=$name; 22 $this->color=$color; 23 } 24 function show_msg(){ 25 echo $this->color.$this->name; 26 } 27 } 28 ?>
抽象方法和抽象类的一实例
1 <?php 2 /*我有一个商城系统 现在有两件商品 电视和洗衣机 设计时 3 我希望每个商品都输出两个特性 一是价格 而是颜色 4 */ 5 6 //作为设计者 设计好这两个方法名字 7 abstract class Buy{ 8 abstract function price(); 9 abstract function color(); 10 } 11 //写电视机的程序员开始设计 12 class TV extends Buy{ 13 function __construct(){ 14 $this->price(); 15 $this->color(); 16 } 17 function price(){ 18 echo '电视机一台1999元'."<br/>"; 19 } 20 function color(){ 21 echo '电视机只有黑色'; 22 } 23 } 24 //写洗衣机的程序员 25 class WM extends Buy{ 26 function __construct(){ 27 $this->price(); 28 $this->color(); 29 } 30 function price(){ 31 echo '洗衣机2000元'."<br/>"; 32 } 33 function color(){ 34 echo '洗衣机只有白色'; 35 } 36 } 37 //首页程序员调用洗衣机和电视的颜色 可以用同一个方法 38 $obname='WM'; 39 $obj=new $obname; 40 ?>
接口的一个实例
1 <?php 2 abstract class Buy{ 3 abstract function price(); 4 abstract function color(); 5 } 6 //我现在作为设计者 我有个新东西要引入 我引入了新商品 电饭锅 7 //和新特性 就是电视机是有节能补贴的 而电饭锅享受商城的折扣8折 而洗衣机既有节能补贴 又有商城八折 8 //这时我使用接口 来规范 节能补贴 和商城八折 9 interface jieneng{ 10 function jn(); 11 } 12 interface zhekou{ 13 function zhekou(); 14 } 15 //写电视机的程序员开始设计 16 //电视机享受的是节能补贴 17 class TV extends Buy implements jieneng{ 18 function __construct(){ 19 $this->price(); 20 $this->color(); 21 } 22 function price(){ 23 echo '电视机一台1999元'."<br/>"; 24 } 25 function color(){ 26 echo '电视机只有黑色'."<br/>"; 27 } 28 function jn(){ 29 echo '节能补贴800'; 30 } 31 } 32 //写洗衣机的程序员 33 //既有节能补贴 又有折扣 34 class WM extends Buy implements jieneng,zhekou{ 35 function __construct(){ 36 $this->price(); 37 $this->color(); 38 } 39 function price(){ 40 echo '洗衣机2000元'."<br/>"; 41 } 42 function color(){ 43 echo '洗衣机只有白色'."<br/>"; 44 } 45 function jn(){ 46 echo '节能补贴800元'."<br/>"; 47 } 48 function zhekou(){ 49 echo '折扣200元'; 50 } 51 } 52 //写电饭锅的程序员 53 class GUO extends Buy implements zhekou{ 54 function __construct(){ 55 $this->price(); 56 $this->color(); 57 } 58 function price(){ 59 echo '电饭锅2000元'."<br/>"; 60 } 61 function color(){ 62 echo '电饭锅只有白色'."<br/>"; 63 } 64 function zhekou(){ 65 echo '折扣500元'; 66 } 67 } 68 //作为首页程序员 我知道电饭锅和洗衣机有折扣 69 //为不需要单独问这两个页面的程序员 你的折扣方法是什么 因为他们都是按照设计规则书写的 我只需要知道每个程序员写的类名就可以按照不变的方法调用每个程序员写的折扣 70 $obname='WM'; 71 $obj=new $obname; 72 $obj->zhekou(); 73 ?>
自我总结一下什么时候使用接口,什么时候使用抽象类。
当我需要规范命名,而且所有类都有个一共同的特性,共同的方法时,我就使用抽象类。
当我的类继承抽象类的方法后,还有更细分的必要,比如第一个类和第三个类,他们有共同属性,希望统一方法名,第二个类和第四个类有共同属性,希望统一方法名,而第五个类,有他们前四个的共同属性,希望继承他们2波共同的属性,统一方法名,就使用接口。
接口的特点在于多重继承,这就使他更灵活。
多人协作的大项目中,接口和抽象类的良好使用,将使整个项目有序,有条理,便于二次开发。
不然个人写个人的,乱七八糟,一坨坨的,简直无法想象。
即使你遵循开发文档开发,也很难保证你没有地方忘记某个方法,笔误某个方法,接口和抽象类的必须继承性会帮助你在成千上万的方法中快速找到错误。
抽象类是类的类,接口是比抽象类更抽象的类。