小菜鸟一枚,一直搞不懂 namespace、abstract、interface、trait 这些关系,就抽出几天时间研究,做个总结,不足之处希望大家指正交流。

namespace 命名空间

介绍:顾名思义,就是给空间命名。其实最简单的可以把每个文件夹都理解为一个空间,然后我们给这个空间一个定义(namespace),让其成为正式空间。当然并不是说一个文件夹就需要一个空间(最好是),在同一个文件夹、文件也可以定义不同的空间。

作用:假如有两个班(两个文件夹),都有一个叫做 test(文件) 的学生,当两个人需要同时出现时,我们应该怎么呼唤他们不至于搞混?很显然,我们可以带上前缀,比如,个子高的test,长得帅的test,或者一班test,这个前缀就相当于一个声明。而命名空间,也即是声明一个空间,这个空间可以叫做 class1也可以叫做height1。因此,命名空间的最大作用就是解决PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突,也能很好地提高源码的阅读性。如下文,在一个文件里,使用了 namespace 我们就不会调用错方法或类。

abstract、interface、trait的使用请看以下案例(本人现在也不熟、会持续更新的):

<?php
/* ============接口类=============*/
namespace payinterface;
interface PayInterface
{
// 必须为公有
public function query($transaction_number); // 根据流水号查询支付信息
public function check($card_info); // 验证支付信息
public function pay($card_info); // 支付
public function refund($transaction_number); // 根据流水号退款
}
/* =================namespace itemplate end==================== */ /* ============抽象类=============*/
namespace payway;
abstract class PayWay
{
abstract protected function wechat(); // 微信支付
abstract public function alipay(); // 阿里支付
// 继承类的方法声明必须和父类一样(或者更为宽松),且父类方法不能为 private // 普通方法(非抽象方法),不能定义其具体的功能实现
public function test()
{
echo '<br>===================<br>';
echo '这是抽象类普通方法,子类可以使用';
echo '<br>===================<br>';
}
}
/* ================namespace abstractclass end===================== */ /*
* 微信支付方法具体实现
*/
namespace wechat;
use payinterface\PayInterface;
class WeChat implements PayInterface
{
public function query($transaction_number)
{
echo '<br>===================<br>';
echo 'This is WeChat query ' . $transaction_number;
echo '<br>===================<br>';
} public function check($card_info)
{
echo '<br>===================<br>';
echo 'This is WeChat check ' . $card_info;
echo '<br>===================<br>';
} public function pay($card_info)
{
echo '<br>===================<br>';
echo 'This is WeChat pay ' . $card_info;
echo '<br>===================<br>';
} public function refund($transaction_number)
{
echo '<br>===================<br>';
echo 'This is WeChat refund ' . $transaction_number;
echo '<br>===================<br>';
}
}
/* =================namespace wechat end==================== */ /*
* 阿里支付方法具体实现
*/
namespace alipay;
use payinterface\PayInterface;
class AliPay implements PayInterface
{
public function query($transaction_number)
{
echo '<br>===================<br>';
echo 'This is AliPay query ' . $transaction_number;
echo '<br>===================<br>';
} public function check($card_info)
{
echo '<br>===================<br>';
echo 'This is AliPay check ' . $card_info;
echo '<br>===================<br>';
} public function pay($card_info)
{
echo '<br>===================<br>';
echo 'This is AliPay pay ' . $card_info;
echo '<br>===================<br>';
} public function refund($transaction_number)
{
echo '<br>===================<br>';
echo 'This is AliPay refund ' . $transaction_number;
echo '<br>===================<br>';
}
}
/* =================namespace alipay end==================== */ /* ============Trait=============*/ namespace sayworld;
trait SayWorld {
static function sayHello($str)
{
echo '<br>===================<br>';
echo 'World! This is ' . $str;
echo '<br>===================<br>';
}
}
/* ================namespace sayworld end===================== */ namespace pay;
use payway\PayWay;
use wechat\WeChat;
use alipay\AliPay;
use sayworld\SayWorld;
Class Pay extends PayWay
{
use SayWorld; // 不用实例化
public function wechat()
{
SayWorld::sayHello('wechat');
return new WeChat;
}
public function alipay()
{
SayWorld::sayHello('alipay');
return new alipay;
}
}
/* ================namespace pay end===================== */ /* ============实例化=============*/
use pay\Pay;
$pay = new Pay();
$pay->wechat()->query('1234');
$pay->alipay()->query('1234');
$pay->test();

输出结果:

PHP namespace、abstract、interface、trait使用介绍的更多相关文章

  1. Java中为什么有abstract interface 修饰类?

    如果有人问你为什么有abstract interface 修饰类,答案一定是他看到的这种方式一定是反编译出来的结果.实际中abstract interface和interface修饰的类没有区别. 下 ...

  2. Java abstract interface与 interface的区别

    我们常常遇到abstract class与 interface的区别,今天却遇到了abstract interface,感觉interface不用abstract再修饰了啊.结论:事实也确实如此,编译 ...

  3. java的this static public protected private abstract interface 在python的对应,java python一些区别

    1.因为工作的原因,最近使用了三个多月的java作为主力语言.很早之前在菜鸟教程也看过java文档两遍,但实践少,处于能看懂写出来不流畅的状态(对于java必须要略懂,不能能看到就头疼跳过,因为现在百 ...

  4. JAVA中abstract,interface,final,static语法

    转自:http://www.cnblogs.com/yueue/archive/2010/04/20/1715863.html 一,抽象类:abstract     1,只要有一个或一个以上抽象方法的 ...

  5. Interface default method介绍

    一.introduce interface default method Introduce default methodWrite the default method at interfaceTh ...

  6. 关于C++命名空间namespace的理解与使用介绍

    0X00 前言 所谓namespace,是指标识符的各种可见范围.C++标准程序库中的所有标识符都被定义于一个名为std的namespace中. 0x01 与C语言区别 <iostream> ...

  7. java实际项目中interface和abstract interface 区别

    参考:https://zhidao.baidu.com/question/424485344260391052.html 这2种有什么区别,根据实际项目经验 帮我解答下 谢谢啊~~~~~~~~~问题补 ...

  8. Abstract和Virtual和interface , 派生类中重写 override / new关键字

    http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html C#中Abstract和Virtual 在C#的学习中,容易混淆virtua ...

  9. abstract、override、new、virtual、sealed使用和示例

    abstract修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽象类,则这个类智能是其他某个类的基类.抽象方法在抽象类中没有函数体.抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽 ...

随机推荐

  1. MySQL存储过程的动态行转列

    MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...

  2. QT 简单的计算器例子

    开发工具:vs2010.qt5.1 1使用vs新建工程,Base Class 选择QDialog

  3. Repair 暴力

    Description standard input/outputStatements Alex is repairing his country house. He has a rectangula ...

  4. Hadoop完全分布式环境下,DataNode进程正常启动,但是网页上不显示DataNode节点

    Hadoop完全分布式环境下,上传文件到hdfs上时报错: // :: WARN hdfs.DFSClient: DataStreamer Exception org.apache.hadoop.ip ...

  5. Shell笔试题2

    1. 从a.log文件中提取包含"WARNING"或"FATAL",同时不包含"IGNOR"的行,然后提取以":"分割的 ...

  6. SpringMVC配置文件 中 mvcview-controller 标签的使用

    一.<mvc:view-controller path=""/>标签的作用 工程WEB-INF目录下面的JSP页面,我们知道是不能直接使用URL访问到.需要通过控制器转 ...

  7. Magento 中一个订单的“生命历程”

    当我们在网上愉快的买买买的时候, 你知道在这些屏幕“背后”正在进行着什么吗? 1. 当一个产品被加入到购物车后, 实际上发生了什么? 当第一个产品被加入到购物车, 系统首先会生成一个 quote (q ...

  8. ArrayList,Vector, LinkedList 的存储性能和特性

    ArrayList 和Vector他们底层的实现都是一样的,都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内 ...

  9. ionic 2 起航 控件的使用 客户列表场景(三)

    我们来看看客户列表的搜索控件是怎么工作的吧. 1.打开customer.html <ion-content> <ion-searchbar [(ngModel)]="sea ...

  10. Check-Point-Security-Gateway-BYOL-R77.30-041.161

    平台: CentOS 类型: 虚拟机镜像 软件包: checkpoint redhat smartconsole basic software security vfw 服务优惠价: 按服务商许可协议 ...