В PHP-классе есть определения конструкторов, встречающихся в чертах

У меня есть 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 в основном наследуется от класса 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; из класса пользователя, то все работает нормально.

К сожалению, я не могу использовать функции внутри General класс на User учебный класс.

Как решить эту проблему? Я хочу иметь функции внутри General класс, который может использоваться другими классами, особенно класс, который расширен от другого класса, такого как User класс (расширенный от Database учебный класс)

2 ответа

Решение

Хотя здесь это не опубликовано, я предполагаю, что в классе /Database.class.php также есть конструктор. Поскольку PHP на самом деле не выполняет перегрузку функций, может быть только один конструктор - у вас есть два, унаследованный от Database и другой от generalFunctions.

Что вам нужно сделать, так это создать псевдоним вашей функции конструктора признаков с помощью оператора 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 >= 5.4

Также для справки: черты PHP

Простой код, демонстрирующий, что проблема была исправлена ​​в последних версиях 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

Другие вопросы по тегам