我正在使用Laravel(PHP)。我想重构以下代码,要求A类和B类使用相同的funsth()。 funSth()在两个类中重复,而唯一的不同是模型。
有没有一种方法可以简化以下内容?有可能将其重构为第二代码吗?
当前:
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();
}
}
答案 0 :(得分:1)
您可以执行的一种方法是制作一个Trait。特性实质上允许您在多个类中使用相同的代码。
根据您问题中的代码,您的特征将类似于:
trait Y
{
public function funSth()
{
Models\AnyModel::create();
}
}
别忘了为文件添加正确的名称空间。
然后在其他类中,您可以在类主体内使用use
关键字:
class A
{
use Y;
public function main()
{
$this->funA();
}
}
如果特征是在其他命名空间中,则需要使用该命名空间提供完整的类名,或者将特征import引入类中。
答案 1 :(得分:0)
研究一段时间后。这是我的解决方案。
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)
}
}
基本思想是在特征Y中使用抽象类Illuminate\Database\Eloquent\Model
并在其之前初始化模型。