到目前为止,我已经看到了许多用于PHP命名空间的不同命名约定.有些人使用PascalCase\Just\Like\For\Classes,有些人使用,有些underscored\lower_case\names甚至使用Java约定来包名:com\domain\project\package.
问题很简单 - 这些(或其他)公约中的任何一个都可以被称为公认的吗?为什么?是否有像Zend或知名PHP框架开发人员推荐的任何一个?
一些新的PHP 5.3功能,包括命名空间和匿名函数,与PHPDocumentor不兼容,即使使用最新版本也是如此.例如,它只是在遇到"没有名称的函数"时引发错误,即闭包.那么,是否还有其他开源工具可以从PHP 5.3代码中的Javadoc样式注释生成API文档(最好是HTML)?
从5.3版开始,PHP支持静态方法的后期绑定.虽然这是一个无疑是有用的功能,但只有几种情况需要使用它(例如Active Record模式).
考虑这些例子:
1.便利施工人员(::create())
class SimpleObject
{
public function __construct() { /* ... */ }
public static function create()
{
return new static; // or: return new self;
}
}
Run Code Online (Sandbox Code Playgroud)
如果这个类可能被扩展(但是,它没有被同一个包中的任何类扩展),那么应该使用延迟静态绑定来使它更容易扩展(无需重写::create()方法,更重要的是,不必记住要做到这一点)?
注意:这个习惯用于解决在构造对象上调用方法的不可能性:new SimpleObject()->doStuff()在PHP中无效.
2.类常数
class TagMatcher
{
const TAG_PATTERN = '/\<([a-z\-]+?)\>/i';
private $subject;
public function construct($subject) { $this->subject = $subject; }
public function getAllTags()
{
$pattern = static::TAG_PATTERN;
preg_match_all($pattern, $this->subject);
return $pattern[1];
}
}
Run Code Online (Sandbox Code Playgroud)
static::在此示例中使用的原因与前一个类似.它的使用只是因为这个类可以通过扩展它并覆盖常量来匹配不同形式的标签.
那么,要将它们全部包装起来,这些后期静态绑定的使用(以及类似的)是否过度杀伤?是否有明显的性能影响?此外,频繁使用后期绑定是否会降低操作码缓存的整体性能提升?
我的经验主要限于PHP,但据我所知,Rails和ASP.NET MVC都走同样的道路.
问题的关键是,几乎所有的Web框架,我曾经遇到过实现控制器动作作为方法,例如create,edit,show等,这些方法存在于像PostsController一个类,但他们几乎没有共享状态或依赖关系,因为只有其中的一个在整个请求期间被调用.
这就是为什么这个方法看起来很不合理,因为这个类只是作为某种命名空间.查看包含大块几乎没有相关的控制器动作代码的示例组成更大的控制器类也无济于事.然而,许多框架都是这样做的,只有少数框架为每个动作使用一个类.
所以问题是,为什么会这样呢?也许这是主观的,但我相信我可能错过了这种方法的一个重要优势.
在我看来,不同编程语言的Web开发人员经常对此有不同的看法.例如,Ruby Web开发人员(使用Rails作为主导框架)似乎将控制器视为粘合代码,它应该具有功能测试,而不是单元测试.类似的态度在PHP世界中占主导地位,但是有一些主动性(例如Symfony2).
但是,例如,似乎有些ASP.NET MVC开发人员实际上希望他们的控制器 可以进行单元测试.
我想知道的是,这实际上是否适用于Web开发.控制器是否值得单元测试?将它们设计为可单元测试是否会显着削弱非平凡应用程序的开发速度?此外,是否有任何Web框架试图强制执行控制器单元可测试性?欢迎个人经历.
php model-view-controller asp.net-mvc unit-testing ruby-on-rails
php ×6
coding-style ×2
asp.net-mvc ×1
comments ×1
late-binding ×1
namespaces ×1
php-5.3 ×1
phpdoc ×1
syntax ×1
unit-testing ×1