gpt4 book ai didi

php - 如果存在,我如何有条件地使类使用特征?

转载 作者:行者123 更新时间:2023-12-03 20:38:08 25 4
gpt4 key购买 nike

我希望能够 use特质 如果可用 .

显然我不能在类本身内部定义它(语法错误)

//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/

Let's say a few of these controllers (but not all of them) require a database connection. To keep performance up, we shouldn't give every controller the database connection. What we could do is write an abstract class which extends BaseController which provides a database connection. But, in the future, what if an object that is not a controller requires a database connection? Instead of duplicating this logic, we can use horizontal reuse.

A simple trait can be created:

trait DatabaseAware 
{
protected $db;

public function setDatabase($db)
{
$this->db = $db;
}

protected function query($query)
{
$this->db->query($query);
}
}

This trait now provides classes with common database functionality. Any class which requires a database connection, be it a controller or a manager (or anything), can use this trait:

class IndexController extends BaseController 
{
use DatabaseAware;

public function indexAction()
{
$this->query("SELECT * FROM `someTable`");
}
}


当我根据不同对象的需要实现特征时。数据库连接、调试报告等

最佳答案

简单的!

特征

可能可用或不可用的特征将被使用或不使用,但最终将有助于实现接口(interface):

<?php

trait BarTrait
{
public function bar()
{
return 'Hey, I am your friend!';
}
}

界面

我们希望实现的接口(interface):
<?php

interface BarInterface
{
/**
* @return string
*/
public function bar();
}

使用 trait 的类

A类 FooUsingBarTrait它使用一个特征 BarTrait实现上述接口(interface):
<?php

class FooUsingBarTrait implements BarInterface
{
use BarTrait;
}

类不使用特征

A类 FooNotUsingBarTrait不使用特征 BarTrait ,而是实现上述接口(interface)本身:
class FooNotUsingBarTrait implements BarInterface
{
public function bar()
{
return 'Hey, I am one of your friends!';
}
}

有条件地创建类定义

最后,有条件地定义一个类 Foo ,取决于一个特征是否 BarTrait存在与否:
<?php

if (trait_exists(BarTrait::class) {
class Foo extends FooUsingBarTrait
{
}
} else {
class Foo extends FooNotUsingBarTrait
{
}
}

创建您的实例
$foo = new Foo();

$foo->bar();

var_dump(
get_class($foo),
class_parents(Foo::class)
);

备注 如果两个类 FooUsingBarTrait,这可能最有意义。和 FooNotUsingBarTrait实现一个通用接口(interface) - 毕竟,您可能希望提供一些将在两个实现之间共享的功能:一个使用特征,另一个通过其他方式(该类提供的方法)。

供引用,请参阅:
  • http://php.net/manual/en/function.class-parents.php
  • http://php.net/manual/en/function.trait-exists.php

  • 例如,请参阅:
  • https://3v4l.org/fCLkt
  • https://3v4l.org/f77cn
  • 关于php - 如果存在,我如何有条件地使类使用特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45703245/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com