Laravel/PHP重构代码以使用相同的不同模式
我使用的是Laravel(PHP)。我想重构下面的代码,要求类A和类B使用相同的funsth()。funSth()在两个类中重复,而唯一的区别是模型 有没有一种方法可以简化为以下内容?是否可以将其重构为第二个代码 当前:Laravel/PHP重构代码以使用相同的不同模式,php,laravel,Php,Laravel,我使用的是Laravel(PHP)。我想重构下面的代码,要求类A和类B使用相同的funsth()。funSth()在两个类中重复,而唯一的区别是模型 有没有一种方法可以简化为以下内容?是否可以将其重构为第二个代码 当前: class A { public function funSth(){ Models\Profile::create(); } public function main(){ $this->funA();
class A {
public function funSth(){
Models\Profile::create();
}
public function main(){
$this->funA();
}
}
class B {
public function funSth(){
Models\Location::create();
}
public function main(){
$this->funB();
}
}
预期:
class A {
public function main(){
(new Y)->funSth();
}
}
class B {
public function main(){
(new Y)->funSth();
}
}
class Y {
public function funSth(){
Models\AnyModel::create();
}
}
你可以这样做的一个方法是做一个。Traits本质上允许您在多个类中使用相同的代码 根据您问题中的代码,您的特征可能类似于:
trait Y
{
公共职能
{
Models\AnyModel::create();
}
}
不要忘记为文件添加正确的名称空间
然后在其他类中,您可以在类主体中使用use
关键字:
A类
{
使用Y;
公共功能main()
{
$this->funA();
}
}
如果您的trait位于不同的名称空间中,那么您需要在名称空间中提供完整的类名,或者将trait输入到您的类中。研究一段时间后。这是我的解决办法
use Illuminate\Database\Eloquent\Model;
trait Y
{
protected function create(Model $model, array $attributes){
model->create($attributes);
}
}
因此,对于A类和B类:
class A
{
use Y;
public function main($data){
$this->create((new Models\ModelAA), $data)
}
}
class B
{
use Y;
public function main($data){
$this->create((new Models\ModelBB), $data)
}
}
其基本思想是在trait Y中使用抽象类
illighted\Database\Eloquent\Model
,并在此之前初始化模型 下面的答案解决了你的问题还是你仍然有困难?嗨,罗斯,谢谢你的回答。但是在trait Y中没有定义funA()。trait中的funSth()无法基于类A和类B创建模型。