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

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

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

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

  1. <?php
  2. /* ============接口类=============*/
  3. namespace payinterface;
  4. interface PayInterface
  5. {
  6. // 必须为共有
  7. public function query($transaction_number); // 根据流水号查询支付信息
  8. public function check($card_info); // 验证支付信息
  9. public function pay($card_info); // 支付
  10. public function refund($transaction_number); // 根据流水号退款
  11. }
  12. /* =================namespace itemplate end==================== */
  13. /* ============抽象类=============*/
  14. namespace payway;
  15. abstract class PayWay
  16. {
  17. abstract protected function wechat(); // 微信支付
  18. abstract public function alipay(); // 阿里支付
  19. // 继承类的方法声明必须和父类一样(或者更为宽松),且父类方法不能为 private
  20. // 普通方法(非抽象方法),不能定义其具体的功能实现
  21. public function test()
  22. {
  23. echo '<br>===================<br>';
  24. echo '这是抽象类普通方法,子类可以使用';
  25. echo '<br>===================<br>';
  26. }
  27. }
  28. /* ================namespace abstractclass end===================== */
  29. /*
  30. * 微信支付方法具体实现
  31. */
  32. namespace wechat;
  33. use payinterface\PayInterface;
  34. class WeChat implements PayInterface
  35. {
  36. public function query($transaction_number)
  37. {
  38. echo '<br>===================<br>';
  39. echo 'This is WeChat query ' . $transaction_number;
  40. echo '<br>===================<br>';
  41. }
  42. public function check($card_info)
  43. {
  44. echo '<br>===================<br>';
  45. echo 'This is WeChat check ' . $card_info;
  46. echo '<br>===================<br>';
  47. }
  48. public function pay($card_info)
  49. {
  50. echo '<br>===================<br>';
  51. echo 'This is WeChat pay ' . $card_info;
  52. echo '<br>===================<br>';
  53. }
  54. public function refund($transaction_number)
  55. {
  56. echo '<br>===================<br>';
  57. echo 'This is WeChat refund ' . $transaction_number;
  58. echo '<br>===================<br>';
  59. }
  60. }
  61. /* =================namespace wechat end==================== */
  62. /*
  63. * 阿里支付方法具体实现
  64. */
  65. namespace alipay;
  66. use payinterface\PayInterface;
  67. class AliPay implements PayInterface
  68. {
  69. public function query($transaction_number)
  70. {
  71. echo '<br>===================<br>';
  72. echo 'This is AliPay query ' . $transaction_number;
  73. echo '<br>===================<br>';
  74. }
  75. public function check($card_info)
  76. {
  77. echo '<br>===================<br>';
  78. echo 'This is AliPay check ' . $card_info;
  79. echo '<br>===================<br>';
  80. }
  81. public function pay($card_info)
  82. {
  83. echo '<br>===================<br>';
  84. echo 'This is AliPay pay ' . $card_info;
  85. echo '<br>===================<br>';
  86. }
  87. public function refund($transaction_number)
  88. {
  89. echo '<br>===================<br>';
  90. echo 'This is AliPay refund ' . $transaction_number;
  91. echo '<br>===================<br>';
  92. }
  93. }
  94. /* =================namespace alipay end==================== */
  95. /* ============Trait=============*/
  96. namespace sayworld;
  97. trait SayWorld {
  98. static function sayHello($str)
  99. {
  100. echo '<br>===================<br>';
  101. echo 'World! This is ' . $str;
  102. echo '<br>===================<br>';
  103. }
  104. }
  105. /* ================namespace sayworld end===================== */
  106. namespace pay;
  107. use payway\PayWay;
  108. use wechat\WeChat;
  109. use alipay\AliPay;
  110. use sayworld\SayWorld;
  111. Class Pay extends PayWay
  112. {
  113. use SayWorld; // 不用实例化
  114. public function wechat()
  115. {
  116. SayWorld::sayHello('wechat');
  117. return new WeChat;
  118. }
  119. public function alipay()
  120. {
  121. SayWorld::sayHello('alipay');
  122. return new alipay;
  123. }
  124. }
  125. /* ================namespace pay end===================== */
  126. /* ============实例化=============*/
  127. use pay\Pay;
  128. $pay = new Pay();
  129. $pay->wechat()->query($id = '1234');
  130. $pay->alipay()->query($id = '1234');
  131. $pay->test();

输出结果:

版权声明:本文为it-abel原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/it-abel/p/9315664.html