2

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

class/General.class.php
class/Database.class.php
class/User.class.php

类/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 基本上继承自 Database 类:

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');

?>

我收到以下错误:

Fatal error: User has colliding constructor definitions coming from traits in /home/***/public_html/class/User.class.php on line 178

但是当我use generalFunctions;从 User 类中删除时,一切正常。

不幸的是,我不能在General课堂上使用函数User

如何解决这个问题呢?我想在类内部有General其他类可以使用的函数,特别是从其他类扩展的类,例如User类(从Database类扩展)

4

2 回答 2

2

虽然这里没有发布,但我猜 class/Database.class.php 里面也有一个构造函数。由于 PHP 并没有真正进行函数重载,因此只能有一个构造函数 - 你有两个,一个从 Database 继承,另一个从 generalFunctions 继承。

您需要做的是使用 use 语句为您的 trait 构造函数起别名

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 >= 5.4 的特性中重载类构造函数

也供参考:PHP Traits

于 2016-01-15T05:40:00.950 回答
0

一个简单的代码来证明该问题已在最近的 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;

可以在这里查看:https ://3v4l.org/gcp9J

于 2018-09-23T15:06:29.463 回答