【发布时间】:2017-08-16 00:06:40
【问题描述】:
我希望能够use trait如果它可用。
显然我不能在类本身内部定义它(语法错误)
//fails
include_once('myTrait.php');
class foo
{
var $bar;
if (trait_exists('myTrait')) {
use myTrait;
}
}
//also fails
foo use myTrait;
//also fails
$f = new foo();
$f use myTrait;
//also fails
$f = new foo() use myTrait;
理想的情况是这样的:
class foo
{
var $bar;
}
if (file_exists('myTrait.php')) {
include_once('myTrait.php');
//make class foo use myTrait;
}
$f=new foo();
很难找到文档和特征似乎不是很受欢迎,但在我的特殊情况下它们非常有用。我还尝试通过仅在需要时包含文件来尽可能减少资源。
像往常一样欢迎提示、文档和解释。
我的搜索带给我的最接近的是这篇文章http://brendan-bates.com/traits-the-right-way/
假设其中一些控制器(但不是全部)需要 数据库连接。为了保持性能,我们不应该付出所有 控制数据库连接。我们能做的就是写一个 扩展提供数据库的 BaseController 的抽象类 联系。但是,在未来,如果一个对象不是 控制器需要数据库连接?而不是复制这个 逻辑上,我们可以使用横向复用。
可以创建一个简单的特征:
trait DatabaseAware { protected $db; public function setDatabase($db) { $this->db = $db; } protected function query($query) { $this->db->query($query); } }这个特性现在为类提供了通用的数据库功能。 任何需要数据库连接的类,无论是控制器还是 经理(或任何人)可以使用此特征:
class IndexController extends BaseController { use DatabaseAware; public function indexAction() { $this->query("SELECT * FROM `someTable`"); } }
我根据不同对象的需要来实现特征。数据库连接、调试报告等
【问题讨论】:
-
你可以根据特征的存在定义一个完整的类(在
if(trait_exists('myTrait'))内) -
A
trait用新方法“增强”了一个类。如果您不知道何时编写代码,如果类提供了方法,您打算如何使用这些方法?在我看来,您试图以错误的方式解决一个完全不同的问题。 -
“我还尝试通过仅在需要时包含文件来保持资源尽可能低。” -- 这是自动加载器的责任。
-
@axiac 这可以通过实现一个接口来解决 - 或者 trait 提供实现,如果没有,则以其他方式实现。