Laravel控制器使用使用另一个使用特征的特征

时间:2018-04-06 12:18:40

标签: php laravel laravel-5 php-7 traits

我有一个使用两个特征CavityToolsOperationTools

的控制器
class OperationController extends Controller
{

    use \App\Traits\CavityTools;
    use \App\Traits\OperationTools;

然而,第二个特征OperationTools using CavityTools`:

trait OperationTools {
    use \App\Traits\CavityTools;

因此,当我尝试使用OperationTools等任何控制器方法中的$this->getProduction()方法时,我得到一个错误,告诉我CavityTools中的方法它不会因碰撞而被应用:

  

特征方法cavityPerformanceBetweenTimes尚未应用,   因为与其他特质方法存在碰撞   应用\ HTTP \控制器\ OperationController

我试图为第二个特征use \App\Traits\OperationTools as OpTs;添加别名,但它会生成解析错误:

  

解析错误:语法错误,意外' as' (T_AS),期待','要么   &#39 ;;'或' {'

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

这是因为两个特征都有相同的功能。为避免这种情况,您必须在当前班级中使用“ReplaceOf”。

参考 - Collisions with other trait methods

答案 1 :(得分:1)

仅使用OperationTools特征,因为CavityTools已被使用。

示例代码:

<?php


trait A {
    function a() {
        echo "a trait\n";
    }
}

trait B {
    use A;
    function b() {
        echo "b trait\n";
    }

    function a() {
        echo "a fcn from trait B\n";
    }
}

trait C {
    use B;
    function a() {
        echo "a fcn from C trait\n";
    }

    function b() {
        echo "b fcn from C trait\n";
    }
}


class AClass {
    use A;
}

$classA = new AClass;
$classA->a();
// $classB->b(); // will throw up


class BClass {
    use B;
}

$classB = new BClass;
$classB->a();
$classB->b();

class CClass {
    use C;
}

$classC = new CClass;
$classC->a();
$classC->b();

//输出

a trait
a fcn from trait B
b trait
a fcn from C trait
b fcn from C trait