PHP 抽象类、接口,traint详解
PHP底层实现(http://blog.jobbole.com/94475/)
一,抽象类:abstract
abstract class HeHe{
public $age=18;//可以定义属性
public function say(){//可以方法实现 echo "i am say"; }
abstract public function run();//方法声明 不能有花括号,抽象类可以没有抽象方法
}
抽象类归纳总结:
1定义为抽象的类不能被实例化。
2任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
3抽象类可以没有抽象方法,但是抽象类依然不能被实例化,被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现
4继承一个抽象类的时候,非抽象子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。
例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
补充:
抽象类可以有成员属性
2有人问:抽象方法是否可以定义为私有,答案是不可以,因为抽象接口的目的就是为了抽象出类模型用来继承,定义为私有,外部访问不到,偏移了设计目的会报错
3抽象类可以实现接口,且可以不实现其中的方法
4抽象类可以继承抽象类,且不能重写抽象父类的抽象方法,否者会报错。这样的用法,可以理解为对抽象类的扩展,使用关键词extends,若重写抽象父类的抽象方法则会报错
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);
}
}
二,接口:interface
interface goSchool{interface
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;
}
}
接口讲解:
三,特性:trait
1如果说:继承可以纵向扩展一个类,那么trait就是横向扩展一个类功能;trait不能被实例化
<?php
trait Dog{
public $name="dog";
public function drive(){
echo "This is dog drive";
}
public function eat(){
echo "This is dog eat";
}
} class Animal{
public function drive(){
echo "This is animal drive";
}
public function eat(){
echo "This is animal eat";
}
} class Cat extends Animal{
use Dog;
public function drive(){
echo "This is cat drive";
}
}
$cat = new Cat();
$cat->drive();//This is cat drive
$cat->eat(); //This is dog eat
?>
4一个类可以组合多个Trait,通过逗号相隔 use trait1,trait2
5当不同的trait中,却有着同名的方法或属性,会产生冲突,可以使用insteadof或 as进行解决,insteadof 是进行替代,而as是给它取别名
<?php
trait trait1{
public function eat(){
echo "This is trait1 eat";
}
public function drive(){
echo "This is trait1 drive";
}
}
trait trait2{
public function eat(){
echo "This is trait2 eat";
}
public function drive(){
echo "This is trait2 drive";
}
}
class cat{
use trait1,trait2{
trait1::eat insteadof trait2;
trait1::drive insteadof trait2;
}
}
class dog{
use trait1,trait2{
trait1::eat insteadof trait2;
trait1::drive insteadof trait2;
trait2::eat as eaten;
trait2::drive as driven;
}
}
$cat = new cat();
$cat->eat();//This is trait1 eat
$cat->drive(); //This is trait1 drive
$dog = new dog();
$dog->eat(); //This is trait1 eat
$dog->drive(); //This is trait1 drive
$dog->eaten();//This is trait2 eat
$dog->driven(); //This is trait2 drive
?>
6as 还可以修改方法的访问控制
<?php
trait Animal{
public function eat(){
echo "This is Animal eat";
}
} class Dog{
use Animal{
eat as protected;//写成Animal::eat as protected 规范点
}
}
class Cat{
use Animal{
Animal::eat as private eaten;
}
}
$dog = new Dog();
$dog->eat();//报错,因为已经把eat改成了保护 $cat = new Cat();
$cat->eat();//正常运行,不会修改原先的访问控制
$cat->eaten();//报错,已经改成了私有的访问控制
?>
7Trait也可以互相组合,还可以使用抽象方法,静态属性,静态方法等
<?php
trait Cat{
public function eat(){
echo "This is Cat eat";
}
} trait Dog{
use Cat;
public function drive(){
echo "This is Dog drive";
}
abstract public function getName(); public function test(){
static $num=0;
$num++;
echo $num;
} public static function say(){
echo "This is Dog say";
}
}
class animal{
use Dog;
public function getName(){
echo "This is animal name";
}
} $animal = new animal();
$animal->getName();//This is animal name
$animal->eat(); //This is Cat eat
$animal->drive(); //This is Dog Drive
$animal::say(); //This is Dog say
$animal->test(); //1
$animal->test(); //2
?>
PHP 抽象类、接口,traint详解的更多相关文章
- c#接口使用详解
c#接口使用详解 c#中接口隐式与显示实现 c#中接口可以隐式实现.显示实现,隐式实现更常使用.显示实现较少使用 其区别在于 显示实现避免接口函数签名冲突 显示实现只可以以接口形式调用 显示实现其子类 ...
- “全栈2019”Java第五十九章:抽象类与抽象方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java语言Socket接口用法详解
Socket接口用法详解 在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...
- Java之函数式接口@FunctionalInterface详解(附源码)
Java之函数式接口@FunctionalInterface详解 函数式接口的定义 在java8中,满足下面任意一个条件的接口都是函数式接口: 1.被@FunctionalInterface注释的接口 ...
- SpringMVC(4.2):Controller接口控制器详解(2)
原文出处: 张开涛 4.5.ServletForwardingController 将接收到的请求转发到一个命名的servlet,具体示例如下: package cn.javass.chapter4. ...
- WebApi 接口参数详解
WebApi 接口参数不再困惑:传参详解 阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.“怪异”的get请求 二.post请求 1.基础类型参数 2.实体作为 ...
- 微信JS-SDK之图像接口开发详解
由于现在手头的项目中有一个上传证件照认证的功能(手机端),之前的思路是直接点击上传,然后直接将图片上传到服务器去,这篇文章有讲到(http://www.cnblogs.com/it-cen/p/453 ...
- python接口自动化(六)--发送get请求接口(详解)
简介 如果想用python做接口测试,我们首先有不得不了解和学习的模块.它就是第三方模块:Requests. 虽然Python内置的urllib模块,用于访问网络资源.但是,它用起来比较麻烦,而且,缺 ...
- SpringMVC(4.1):Controller接口控制器详解(1)
原文出处: 张开涛 4.1.Controller简介 Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分: 1.收集.验证请求参数并绑定到命令对象: ...
随机推荐
- 【webpack】使用DllPlugin拆分模块
开发过程中,我们经常需要引入大量第三方库,这些库并不需要随时修改或调试,我们可以使用DllPlugin和DllReferencePlugin单独构建它们. 具体使用如下: const HtmlWebp ...
- 服务器多站点多域名HTTPS实现
假设有这样一个场景,我们有多个站点(例如site1.marei.com,site2.marei.com和site3.marei.com)绑定到同一个IP:PORT,并区分不同的主机头.我们为每一个SS ...
- java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException or 程序包 javax.servlet 不存在
遇到下面这个问题 程序包 javax.servlet 不存在 或者 java.util.concurrent.ExecutionException: org.apache.catalina.Lifec ...
- response的字节流和字符流输入的区别和问题--02-response的outputStream输出数据的问题.avi
02-response的outputStream输出数据的问题.avi; [字节流] 用meta标签 第一段原始代码:写错: 03-response的Writer输出数据的问题.avi;[字符流输出] ...
- vue 学习笔记—axios(替代vue-resource)
一.使用 1. 引入CDN的方式 https://unpkg.com/axios@0.16.2/dist/axios.min.js 或者 npm方式 npm install axios --sa ...
- “指定的参数已超出有效值的范围”在【 parameterUpdate.Add(new OracleParameter("STATUS", 0));】报错
改成:parameterUpdate.Add()); 就不报错,并不能知道为什么,有知道为什么的,评论告诉我. /// <summary> /// 插入数据 /// </summar ...
- Spring Aware接口
实现aware接口的bean必须在spring的xml文件中注册,由spring的IOC容器管理 1-ApplicationContextAware接口 可以获取spring的IOC容器 2-Bean ...
- PHP操作MongoDB 数据库
最近有个项目,需要用php操作mongoDb数据,整理如下 1,连接MongoDB数据库 $conn = new Mongo(); 其他链接方式 //$conn=new Mongo(); #连接本地主 ...
- 【转】thread.sleep(0)与thread.sleep(1)的区别
Thread.Sleep(0) Sleep的意思是告诉操作系统自己要休息n毫秒,这段时间就让给一个就绪的线程吧.当n=0时,意思是要放弃自己剩下的时间片,但是仍然是就绪状态.Sleep(0)只允许那些 ...
- epoll机制详解
epoll机制详解 大牛的详解 epoll详解 什么是epoll? epoll是为处理大批量句柄而作了改进的poll, 是性能最好的多路I/O就绪通知方法; 只有三个系统调用: epoll_creat ...