【问题标题】:Is there a @visibility package concept in PHPDoc / PHPStorm?PHPDoc / PHPStorm 中是否有@visibility 包概念?
【发布时间】:2012-04-05 10:13:24
【问题描述】:

我有一个用 PHP 编写的域模型,并且我的一些类(聚合内的实体)具有公共方法,不应该从聚合外部调用。

PHP 没有 package 可见性概念,所以我想知道是否有某种标准化的方式来定义 @package@visibility package 在文档块中,并有一个静态可以报​​告违反可见性范围的分析工具。

我目前正在试用PHPStorm,到目前为止我发现它非常好,所以我想知道这个软件是否支持这个功能;如果没有,你知道有什么静态代码分析工具吗?

【问题讨论】:

    标签: package visibility php-5.3 phpdoc phpstorm


    【解决方案1】:

    我在 PHP 的功能中看到的与这种思路最相似的方法是对这些方法使用“受保护”范围而不是公共范围。当然,这需要使用继承来授予对受保护项目的访问权限。在我管理 phpDocumentor 的这些年里,我从来没有遇到过任何试图模仿我在 Java 时代记得的那种“包范围”的东西。

    【讨论】:

    • 当我谈到聚合时,它们实际上是由几个对象组成的,它们必须通过它们的公共方法进行通信。我知道 PHP 的局限性,并没有试图真正模仿 Java,只是试图提示 PHP 代码分析工具,以便它可以报告我的类的潜在错误使用!
    【解决方案2】:

    如果聚合根中的实体在不经过聚合根的情况下不可修改,那么您必须控制的唯一方法是使实体成为私有或受保护的成员,以便对实体的所有修改都必须经过聚合。

    class RootEntity {
        private $_otherEntity;
        public function DoSomething() {
            $this->_otherEntity->DoSomething();
        }
        public function setOtherEntity( OtherEntity $entity ) {
            $this->_otherEntity = $entity;
        }
    }
    

    总有人可以做到:

    $otherEntity = new OtherEntity();
    $otherEntity->DoSomethingElse();
    $rootEntity->setOtherEntity($otherEntity);
    

    不过,我想您可以使用神奇的 __call() 方法来禁止在构建期间以外的任何地方设置 _otherEntity。这属于总黑客类别:)

    class RootEntity {
        private $_otherEntity;
        private $_isLoaded = false;
    
        public function __call( $method, $args ) {
            $factoryMethod = 'FactoryOnly_'.$method;
            if( !$this->_isLoaded && method_exists($this,$factoryMethod) {
                call_user_func_array(array($this,$factoryMethod),$args
            }
        }
        public function IsLoaded() {
            $this->_isLoaded = true;
        }
        protected function FactoryOnly_setOtherEntity( OtherEntity $otherEntity ) {
            $this->_otherEntity = $otherEntity;
        }
    }
    

    因此,从那里,当您构建对象时,您可以从您的工厂或存储库调用 $agg->setOtherEntity($otherEntity)。然后,当您完成构建对象时,调用 IsLoaded()。从那里开始,没有其他人能够将新的 OtherEntity 引入类中,并且必须在您的聚合上使用公开可用的方法。

    我不确定您是否可以称其为“好”答案,但这是我能想到的唯一真正限制对聚合中实体的访问的方法。

    [编辑]:另外,忘了提...最接近的文档是phpdoc有一个@internal: http://www.phpdoc.org/docs/latest/for-users/tags/internal.html

    但是,我怀疑它会修改 IDE 的代码完成。不过,您可能会创建一个公共函数/属性,但使用 phpdoc 将其标记为“@access private”,以防止它进入代码完成状态。

    【讨论】:

    • @internal 可能是解决方案,但迄今为止,它仍然不受支持!
    【解决方案3】:

    到目前为止,PHPStorm 似乎还没有提供这个功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      相关资源
      最近更新 更多