В 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