小菜鸟一枚,一直搞不懂 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();

输出结果:

最新文章

  1. Mask裁切UI粒子特效或者3D模型
  2. php无法创建中文名的文件
  3. 常用webservice接口
  4. CentOS6.5以runlevel 3开机时自动连接某无线设置示例
  5. 黄聪:WordPress 多站点建站教程(六):使用WP_Query、switch_to_blog函数实现获取子站点分类中的文章
  6. 冒泡排序(C++)
  7. IO多路复用之select
  8. SharePoint 配置传出电子邮件设置
  9. 云计算---openstack镜像制作详解
  10. poj 2888 Magic Bracelet(Polya+矩阵快速幂)
  11. Android开发学习之路--百度地图之初体验
  12. java爬虫,爬取当当网数据
  13. Java的三大特性
  14. Oracle通用维、父子维相互转换
  15. tomcat的LifecycleException异常
  16. IDEA操作技巧与Tomcat集成
  17. Windows 端口占用解决
  18. Part 5 - Django ORM(17-20)
  19. Java 设计模式(三)-单例模式(Singleton Pattern)
  20. 由PostgreSQL的区域与字符集说起(转)

热门文章

  1. (转)Linux 开机引导和启动过程详解
  2. JAVA 面试重点知识个人总结
  3. python协程与异步协程
  4. 在Magento System Configuration页面添加配置项
  5. mysql登陆远程数据库
  6. Yii2.0 高级版安装 windows
  7. NEO
  8. Redis分片(分区)
  9. 性能调优--大事务与Alwayson 之间的关系
  10. 解决mysql连接输入密码提示Warning: Using a password on the command line interface can be insecure