在PHP編程中,我們會經常遇到需要調用被繼承的方法的情況。
比如在處理登錄邏輯時,我們可能需要驗證用戶提交的驗證碼是否合法,這時你就需要在原有的方法上添加你自己關於驗證碼驗證相關的邏輯。
有個很蠢的方法,就是直接到原有的方法,copy原有的代碼,粘貼到自己的關於驗證碼處理的邏輯的部分。可這種代碼的耦合度……(不忍直視)當原有邏輯變化時,就會罵娘了。
對於繼承類的情況,我們有很好用的parent::
可以用,直接將手伸進繼承的類中……
可是,trait的情況呢?我們看下面的例子(無關代碼已刪除)
<?php
namespace App\Http\Controllers\Auth;
use Origlnal;
use Http\Request;
class LoginController
{
use Origlnal;
/**
* Validate the user login Captcha request.
*
* @param Http\Request $request
* @return void
*/
protected function validateLogin(Request $request)
{
$this->validate($request, [
'geetest_challenge' => 'geetest',
], [
'geetest' => config('geetest.server_fail_alert')
]);
}
}
在這段代碼中,validateLogin 繼承的是 Origlnal 中的同名方法。可此方法只負責驗證碼的驗證。
對於trait就沒有parent::
了,而Origlnal::
會因為未實例化而報錯。
就只能高耦合了嗎?NO……
我們可以這樣解決:將use Origlnal
修改成如下代碼。
use Origlnal
{
validateLogin as foo;
}
這樣,Origlnal中的validateLogin方法就會變成foo方法,在新方法中調用foo($request);
即可。
總結:
我的屁話那么多,其實就是一句話:把原來的方法用 use+as 換成另外的名字引用,即可。
若有更好的方法,還請高人指教,謝謝。