小菜鳥一枚,一直搞不懂 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();
輸出結果: