PHP类具有来自Traits的冲突构造函数定义

PHP类具有来自Traits的冲突构造函数定义,php,function,class,traits,name-collision,Php,Function,Class,Traits,Name Collision,我有3个相互关联的文件: class/General.class.php class/Database.class.php class/User.class.php class/General.class.php包含: trait generalFunctions { private $unique_number; private $mysql_datetime; private $mysql_date; function __construct($uniq

我有3个相互关联的文件:

class/General.class.php
class/Database.class.php
class/User.class.php
class/General.class.php包含:

trait generalFunctions {

    private $unique_number;
    private $mysql_datetime;
    private $mysql_date;

    function __construct($unique_number, $mysql_datetime, $mysql_date) {
        $this->unique_number = $unique_number;
        $this->mysql_datetime = $mysql_datetime;
        $this->mysql_date = $mysql_date;
    }


    public function encryptData ($data) {
        $unique_number = $this->unique_number;
        $data = $unique_number . $data;
        return $data;
    }

}

class General {
    use generalFunctions;
}

?>
而class/User.class.php基本上继承自数据库类:

class User extends Database {
    use generalFunctions;

    public function trialEncrypt ($data) {
    // some code here which need encryptData function from General class
    }
}
当我尝试使用这些类时:

<?php
include('config.php');
include('class/General.class.php');
include('class/Database.class.php');
include('class/User.class.php');

?>
但是当我删除
时,使用general函数来自用户类,然后一切正常

不幸的是,我不能在
User
类中使用
General
类中的函数


如何解决这个问题?我希望在
General
类中有一些函数可以被其他类使用,特别是从其他类扩展而来的类,比如
User
类(从
Database
类扩展而来)

虽然这里没有发布,但我猜class/Database.class.php中也有一个构造函数。由于PHP实际上不进行函数重载,所以只能有一个构造函数——您有两个,一个是从数据库继承的,另一个是从泛型函数继承的

您需要做的是将trait构造函数与use语句别名

class User extends Database {
    use generalFunctions { 
         generalFunctions::__construct as private traitConstructor; 
    }

    public function trialEncrypt ($data) {
    // some code here which need encryptData function from General class
    }
}
另一个例子:


另供参考:

一个简单的代码,用于证明问题已在最新的PHP版本中得到解决:

<?php
/* The fatal error has been fixed in PHP 5.5.21 */

trait MyTrait {
    public function __construct() {}
}

class MyParent{
    public function __construct() {}
}

class MyClass1 extends MyParent{
    use MyTrait;
}

class MyClass2 extends MyParent {
    use MyTrait;
}

$o1 = new MyClass1;
$o2 = new MyClass2;

数据库的定义是什么?它有构造函数吗?如果是这样的话,那就是冲突的根源。您还应该创建一个调用
$this->traitConstructor()
和可能的
parent::construct()
\u construct
函数。
<?php
/* The fatal error has been fixed in PHP 5.5.21 */

trait MyTrait {
    public function __construct() {}
}

class MyParent{
    public function __construct() {}
}

class MyClass1 extends MyParent{
    use MyTrait;
}

class MyClass2 extends MyParent {
    use MyTrait;
}

$o1 = new MyClass1;
$o2 = new MyClass2;