注释在 PHP 中有何用处?

2022-08-30 11:12:22

注释在 PHP 中有何用处?我不是泛指PHPDoc。

我猜,我只想要一个真实世界的例子什么的。


因此,根据@Max的答案:注释完成与抽象工厂相同的事情,仅通过一行专门的PHPDoc。– 希望 0 秒前编辑


答案 1

Rob Olmos解释得对:

注释基本上可以让你注入行为,并且可以促进解耦。

用我的话说,我会说这些注释是有价值的,特别是在反射的上下文中,你收集(额外的)关于你正在检查的类/方法/属性的元数据。

另一个代替ORM的例子:依赖注入框架。例如,即将推出的 FLOW3 框架使用 docComments/annotations 来标识在从 DI 容器创建的实例中注入哪些对象,而不是在 XML 配置文件中指定它。

下面是一个过于简化的示例:

你有两个类,一个类和一个类。实例被注入到实例中。看看这两个类的定义:SoldierWeaponWeaponSoldier

class Weapon {
    public function shoot() {
        print "... shooting ...";
    }
}

class Soldier {
    private $weapon;

    public function setWeapon($weapon) {
        $this->weapon = $weapon;
    }

    public function fight() {
        $this->weapon->shoot();
    }
}

如果你使用这个类并手动注入所有依赖项,你会这样做:

$weapon = new Weapon();

$soldier = new Soldier();
$soldier->setWeapon($weapon); 
$soldier->fight();

好吧,这是很多样板代码(请原谅我,我很快就会解释哪些注释是有用的)。依赖关系注入框架可以为您做的是抽象创建这样的组合对象并自动注入所有依赖项,您只需执行以下操作:

$soldier = Container::getInstance('Soldier');
$soldier->fight(); // ! weapon is already injected

是的,但是必须知道类具有哪些依赖项。因此,大多数通用框架使用 XML 作为配置格式。配置示例:ContainerSoldier

<class name="Soldier">
    <!-- call setWeapon, inject new Weapon instance -->
    <call method="setWeapon">
        <argument name="Weapon" />
    </call>
</class>

但是FLOW3代替XML使用的是直接在PHP代码中进行注释,以便定义这些依赖项。在 FLOW3 中,您的类将如下所示(语法仅作为示例):Soldier

class Soldier {
    ...

    // ---> this

    /**
     * @inject $weapon Weapon
     */
    public function setWeapon($weapon) {
        $this->weapon = $weapon;
    }

    ...

因此,不需要 XML 来标记 DI 容器的依赖关系。SoldierWeapon

FLOW 3 也在 AOP 的上下文中使用这些注释来标记应“编织”的方法(表示在方法之前或之后注入行为)。


就我而言,我不太确定这些注释是否有用。我不知道它是否使事情变得更容易或更糟,在PHP代码中“隐藏”这种依赖关系和设置,而不是使用单独的文件。

例如,我在 Spring.NET,NHibernate和PHP中的DI框架(不是FLOW3)中工作过,这两者都基于XML配置文件,不能说这太难了。维护这些安装文件也是可以的。

但也许使用FLOW3的未来项目证明恰恰相反,注释是真正的方法。


答案 2

它到底有什么好处?

注释基本上可以让你注入行为,并且可以促进解耦。一个例子是教义ORM。由于使用了注释,因此您不必像Propel ORM那样从特定于教义的类继承。

难以调试延迟加载动态编码?

不幸的是,这是一个副作用,就像大多数/所有解耦操作一样,例如设计模式,数据转换等。

嗯。我的大脑仍然没有摸索它。– 希望寻找者

如果未从 Doctrine 类继承,则很可能必须使用其他一些元数据规范(如配置文件)来指定特定属性是记录的 ID。在这种情况下,它与注释(元数据)描述的语法相去甚远。


推荐