什么是抽象类
> 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
抽象类的特性
1. 定义为抽象的类不能被实例化
2. 如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的
3. 被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现
4. 继承一个抽象类的时候,子类必须定义父类中的所有抽象方法(这些方法的访问控制必须和父类中一样(或者更为宽松))
5. 子类可以定义一个可选参数(**也就是必须要有默认值**),而父类抽象方法的声明里没有,则两者的声明并无冲突
6. 抽象类可以没有抽象方法,反过来有抽象方法的类一定要声明为抽象类
7. 抽象方法可以为静态方法
~~~
<?php
abstract class AbstractClass
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut()
{
print $this->getValue() . "\n";
}
}
class ConcreteClass1 extends AbstractClass
{
//父类定义了俩个抽象方法,如子类只实现了其中一个,则报如下错误
//Fatal error: Class ConcreteClass1 contains 1 abstract //method and must therefore be declared abstract or
//implement the remaining methods //(AbstractClass::prefixValue)
public function getValue()
{
return "ConcreteClass1";
}
// 且子类的访问权限不能低于父类,如果将如下子类的访问方式改为private则会报如下错误
//Fatal error: Access level to //ConcreteClass1::prefixValue() must be protected (as in //class AbstractClass) or weaker
public function prefixValue($prefix)
{
return "{$prefix}ConcreteClass1";
}
}
//当实例化一个抽象类时,Fatal error: Cannot instantiate //abstract class AbstractClass
//$obj = new AbstractClass();
// 但是我们可以这么使用
##########################################################
abstract class Foo
{
static function bar()
{
echo "test\n";
}
}
Foo::bar();
##########################################################
$obj = new ConcreteClass1();
echo $obj->getValue();
~~~
文章来源:
http://blog.csdn.net/fationyyk/article/details/51005929
- 前言
- 函数参考
- Socket 函数
- socket_accept
- socket_bind
- socket_clear_error
- socket_close
- socket_connect
- socket_create_listen
- socket_create_pair
- socket_create
- socket_getpeername
- socket_getsockname
- socket_last_error
- socket_listen
- socket_read
- socket_recv
- socket_select
- socket_send
- socket_set_block
- socket_set_nonblock
- SplQueue
- 魔术方法
- 魔术常量
- 杂项
- backlog的用处
- new self()和new static()的区别
- PHP变量的生命周期
- PHP抽象类
- 对象接口
- PHP中的常用关键字
- 常量
- 内存泄露
- global 与 $GLOBAL
- 简单说明CGI和动态请求是什么
- 设计模式
- 单例模式
- 工厂模式
- 适配器模式
- 策略模式
- 观察者模式
- 控制反转IoC简介
- session
- use_trans_sid
- auto_start
- session_id
- cookie_secure
- 面试
- 数据库相关
- 语句相关
- 索引相关
- 字段相关
- PHP相关
- 字符串相关
- 函数相关
- 运算符优先级相关
- 错误相关
- redis相关
- 10个常见的Redis面试"刁难"问题
- mysql
- MySQL中的锁
- MySQL存储引擎MyISAM 和 InnoDB的区别
- MySQL半同步复制
- explain 命令详解
- 索引
- 数据库事务
- MySQL和B树的那些事
- git
- github----向开源框架提交pr的过程
- 推荐博客
- linux
- 命令
- free
- 高并发
- 抢购/秒杀功能
- 算法
- 一致性Hash算法