У меня есть 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
учебный класс)
Хотя здесь это не опубликовано, я предполагаю, что в классе / 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