abstract class HeHe{
public $age=18;//可以定义属性
public function say(){//可以方法实现 echo "i am say"; }
abstract public function run();//方法声明 不能有花括号,抽象类可以没有抽象方法
}
抽象类归纳总结:抽象类可以没有抽象方法,但是抽象方法必须放在抽象类中,除此之外,抽象类和普通类无差别;如可以有方法实现,可以定义属性等等。。。但是,抽象方法不能有花括号;
PHP底层实现(http://blog.jobbole.com/94475/)
抽象类是不能被实例化的否则出现以下报错:Fatal error: Uncaught Error: Cannot instantiate abstract class
class Test extends HeHe{
public $name;
public function __construct($a){ $this->name=$a; }
public function run ()
{ //注意:抽象方法必须实现------Fatal error: Class Test contains 1 abstract method and must therefore be declared abstract or implement the remaining methods echo $this->name;
}
public function say($a){ var_dump ($a); }
}
继承类总结:继承类中,可以对继承过来的方法重写,甚至可以改变参数的个数,类型,但是会报warming提示说和抽象类的不兼容;对于抽象方法必须实现。把抽象转化为一般方法,可以留空;
interface goSchool{
const NAME='xiaoming';
/* const和define的区别1、const用于类成员变量的定义,一经定义,不可修改。Define不可以用于类成员变量的定义,可用于全局常量。2、Const可在类中使用,define不能3、Const不能再条件语句中定义常量 */
//接口可以定义常量,但是不能定义成员属性
// 接口可以有一个或者多个成员方法
public function go_111( );}
class Go implements goSchool{
public function go_111(){ echo 11111; }
}
接口讲解:相比较抽象类,接口是不能有成员属性和方法实现的,可以定义常量,相对与抽象类来说,接口的抽象更纯洁,只有抽象方法,没有其他元素,对于接口的实现,接口的方法必须实现,但是接口可以实现多个;附图:
下面说traint
Trait中的方法或属性会覆盖 基类中的同名的方法或属性,而本类会覆盖Trait中同名的属性或方法;traint和类差不多,但是可以被use引入,相对于接口,更加亲民,而且跟class血缘更近,这么说的意思是,父类中的方法可以被traint覆盖,本类可以覆盖traint,引入多个traint时,如果有方法重复,会报一下错误Fatal error: Trait method eat has not been applied, because there are collisions with other trait methods on dog;
方法起别名时用 as ,方法冲突用insteadof