PHP Class 具有来自特征的冲突构造函数定义
PHP Class Has Colliding Constructor Definitions Coming From Traits
我有 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:
class User extends Database {
use generalFunctions;
public function trialEncrypt ($data) {
// some code here which need encryptData function from General class
}
}
当我尝试使用这些 classes 时 :
<?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
但是当我从用户 class 中删除 use generalFunctions;
时,一切正常。
不幸的是,我无法在 User
class.
上使用 General
class 中的函数
如何解决这个问题?我想在 General
class 中使用其他 classes 可以使用的函数,特别是从其他 class 扩展而来的 class,例如 User
class(扩展自Database
class)
虽然这里没有发布,但我猜 class/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
}
}
另一个例子:How to overload class constructor within traits in PHP >= 5.4
另供参考:PHP Traits
证明 问题已在最近的 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
我有 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:
class User extends Database {
use generalFunctions;
public function trialEncrypt ($data) {
// some code here which need encryptData function from General class
}
}
当我尝试使用这些 classes 时 :
<?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
但是当我从用户 class 中删除 use generalFunctions;
时,一切正常。
不幸的是,我无法在 User
class.
General
class 中的函数
如何解决这个问题?我想在 General
class 中使用其他 classes 可以使用的函数,特别是从其他 class 扩展而来的 class,例如 User
class(扩展自Database
class)
虽然这里没有发布,但我猜 class/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
}
}
另一个例子:How to overload class constructor within traits in PHP >= 5.4
另供参考:PHP Traits
证明 问题已在最近的 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