在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 换成另外的名字引用,即可。
若有更好的方法,还请高人指教,谢谢。