小菜鸟一枚,一直搞不懂 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. string中执行sql语句

    Spring(JdbcTemplate.class)中的queryForMap().queryForObject().queryForLong().queryForInt()等方法都会去调用publi ...

  2. mysql主从复制之同步部分库表

    这里以mariadb为例,和mysql一样的配置 系统:centos7 主服务器:192.168.0.1:3305(两台服务器都做过时间同步) 从服务器:192.168.0.2:3306(两台服务器都 ...

  3. hdu 5489——Removed Interval——————【删除一段区间后的LIS】

    Removed Interval Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  4. 洛谷 P1281 书的复制

    书的复制 Code: #include <iostream> #include <cstdio> #include <cstring> using namespac ...

  5. Django的路由层和视图层

    一丶Django 的路由层(URLconf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django ...

  6. JS案例练习-手机微信聊天对话框

    先附图 CSS部分: <style> body{} *{;} li{list-style: none;} .container{ width:310px; height:600px; ma ...

  7. VMware下Centos6.4安装

    VMware(Virtual Machine ware)是一个“虚拟PC”软件公司,提供服务器.桌面虚拟化的解决方案. 小伙伴们网上下载VMware11,一路下一步自己安装吧!!! 打开 VMware ...

  8. PHP代码规范的一些总结

    世界第一语言在手,辅以前人的最佳实践,天下又算什么. 1.代码是写给小白用的 注释,注释,注释,重要的事情说三遍.我们做的虽然不是拿去卖源码的商业产品,不需要把注释写的多么优美.但也不要太过吝啬,到头 ...

  9. 详细讲解:yii 添加外置参数 高级版本

    在YII中,添加状态参数的形式 首先,我们在advanced\common\config\params.php文件中,添加我们要设置的参数: 要在控制器中进行使用的话,形式为:\Yii::$app-& ...

  10. SQL Server 删除当前数据库中所有数据库 ,无视约束

    Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: exec sp_msforeachtable  @Command1 ='truncate table ?' 删除所有数据表: e ...