php注释 - 最小的工作示例

时间:2012-12-10 15:02:16

标签: php dependency-injection annotations metaprogramming

上次我检查(2008)php中的注释并没有那么广泛。现在阅读了一些材料并做了一些“谷歌搜索”后,我仍然有点困惑。有人可以提供一个最小的工作示例来说明如何在php中使用注释:
让我们说我想要这样的东西工作:

class ClassName
{
  /**
  * @DefaultValue("test")
  */
  public $prop;
}

// so that i can do 

$kls = new ClassName();
$kls->prop // => test

我很久没有做过php了

更新
此问题的目的是了解像symfonyflow3doctrine这样的库/框架如何实现其注释。

4 个答案:

答案 0 :(得分:4)

PHP尚未支持注释。有一个RFC for a proposed implementation,但是不知道是否或何时会发生这种情况。

您给出的特定示例可能会被IDE解释为自动完成的值,否则您只能执行public $prop = 'Test';,但我想您已经知道这并不是您的真实意图。

答案 1 :(得分:2)

PHP不应该支持注释,它们目前是PHP开发人员中的祸害。它们会导致许多问题:

  1. 他们打破版本控制。如果你想在不同的项目中有两个不同配置的对象实例,它们会变成不同的分支,即使它是改变的配置而不是逻辑。

  2. 它们降低了可移植性。如果在两个使用注释的项目之间移动一个类,注释可能会破坏第二个项目

  3. 他们破坏了封装。应用程序代码不应该关注如何在外部使用它。注释告诉客户端代码它应该做什么而不是让客户端代码决定。在你的@DefaultValue示例中,如果你在没有注意注释的地方使用该类,该怎么办?如果没有设置默认值,该类是否仍然可以工作?是?没有?也许?无论答案是什么,在API中都不清楚,并且无法知道对象一旦构建好是否已准备好履行其职责。

  4. 他们限制了灵活性。以Symfony的@Inject为例,使用不同的注入参数创建两个类的实例是不可能的。

  5. 请参阅:Annotations are an abominationPHP Annotations Are a Horrible Idea以获取有关应避免这些原因的更详细说明。

答案 2 :(得分:2)

PHP Manual -> Function Reference Variable and Type Related Extensions -> Reflection中,在几个反射类(ReflectionClass,ReflectionMethod,ReflectionFunction,ReflectionFunctionAbstract,ReflectionProperty ...)中存在一个方法getDocComment(),您可以在其中获取doc注释块。然后按照您想要的方式处理您的评论。例如:

class Foo {
   private $a;
   private $b;
   ...
   /**
    * @annotation('baz')
    */
   public function bar() {
      ...
   }
}

$reflMethod = new ReflectionMethod('Foo', 'bar');

//prints 
//string(26) "/**
// * @annotation('baz')
// */"
var_dump($reflMethod->getDocComment());

答案 3 :(得分:0)

PHP不支持注释(还)。

我在PHP中使用注释影响代码流的唯一地方是phpUnit,它支持许多注释标记(例如@DataProvider@ExpectedException)来处理测试脚本的各个方面

效果相当好,但本身并不由PHP处理;在包含脚本并正常运行代码之前,phpUnit必须解析脚本本身。对于单元测试脚本来说足够公平,但不是生产系统的理想解决方案。

所以我认为真正的答案是你必须等到PHP本地实现注释。我相信有一个提议,但它肯定不会很快发生 - 它肯定不会在5.5,将于明年发布。我不认为5.6或更高版本的功能有任何固定的计划,但如果我们至少延伸到2014年,即使假设您的托管服务提供商或服务器管理员愿意立即升级。