陈辉煌 发表于 2017-4-9 07:26:56

PHP实践之路(十)类与对象(3)

  PHP实践之路(目录索引)


类与对象(3)



1、抽象类
  a、在class前面加上abstract关键字类声明一个抽象类,在方法上面加上abstract关键字来定义抽象方法
  b、抽象类不能直接被实例化,你必须先继承该抽象类,然后再实例化子类
  c、抽象类中至少要包含一个抽象方法。如果类方法被声明为抽象的,那么其中就不能包括具体的功能实现
  d、继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法
  e、继承父类的抽象方法时,访问控制必须宽松于父类。宽松程度由大到小依次为public>protected>private
  实验一下

<?php
//换行输出
function println($var){
echo $var;
echo "<br />";
}
abstract class Father
{
abstract function fun1();//抽象方法只声明,不实现
abstract protected function fun2();
function fun3(){
println("I am not abstract method...");
}
private function fun4(){
println("private method...");
}
}
class Child extends Father
{
//父类中fun1默认的可见性为public,所以子类中该方法的可见性必须为public
function fun1(){
println("fun1 executed...");
}
//?此处可见性为protected时将报错,我的php版本为php-5.4.7
function fun2(){
println("fun2 executed...");
}
}
$obj=new Child();
$obj->fun1();//fun1 executed...
$obj->fun2();//fun2 executed...
$obj->fun3();//I am not abstract method...
//$obj->fun4();//父类私有方法不能继承
?>
  
按照API文档介绍抽象方法子类的可见性可与父类一样,但这里的fun2如果采用protected则报错,这是为什么呢?请知情者指教

2、接口
  

a、接口使用interface关键字声明
  b、接口可以理解为类里所有方法都是抽象方法的抽象类,也就是所有方法都只含声明,没有实现(但并不用abstract来声明方法)
  c、接口中定义的所有方法都必须是public
  d、使用implements关键字来实现接口,一个类可以实现多个接口。实现多个接口时,接口中的方法不能有重名
  e、接口也可以继承,通过使用extends操作符
  接下来实验时间

<?php
//换行输出
function println($var){
echo $var;
echo "<br />";
}
//定义一个接口动物
interface Animal{
function walk();
function eat();
}
//定义一个接口人继承自动物
interface Person extends Animal{
function talk();
}
//定义一个接口中国人
interface Chinese{
function work();
}
//定义一个类,实现了Person和Chinese两个接口,必须实现两个接口中的所有方法
class ChineseWorker implements Person,Chinese{
function walk(){
println("walking...");
}
function eat(){
println("eating...");
}
function talk(){
println("talking...");
}
function work(){
println("working in china...");
}
}
$worker=new ChineseWorker();
$worker->walk();//walking...
$worker->eat();//eating...
$worker->talk();//talking...
$worker->work();//working in china...
?>
  


版权声明:本文为博主原创文章,未经博主允许不得转载。
页: [1]
查看完整版本: PHP实践之路(十)类与对象(3)