如何命名命名空间类的文件?


9

WP核心手册> PHP编码标准>命名约定为使用类命名文件提出了以下建议:

类文件名应基于带class- 前缀的类名,并且类名中的下划线用连字符代替,例如WP_Error

class-wp-error.php

从本节的措辞来看,它主要是供核心使用的,但总体而言,编码风格确实确实适用(并且我认为应该如此)适用于第三方WP代码。

但是,由于core不支持名称空间(PHP 5.2,ugh),因此无法解决这种情况。

从开发人员便利性的角度出发,采取什么实际方法?支持自动装带器?

我可以看到多种替代方法:

  • 完全忽略命名空间
  • 在文件名中包括名称空间
  • 使用名称空间作为文件夹级别
  • 完全使用替代命名方案,例如PSR

3
我的诚实观点是,如果您使用PHP 5.3+,则已经违反了WP核心规则。此外,考虑到WP标准没有考虑接口或特性。因此,对我而言,选择一种对您方便的方法并使用像PSR这样已经建立的标准似乎是更好的选择。
gmazzap

Answers:


7

首先,忽略class-前缀。这来自WordPress的纯过程代码方法,类被用作过程代码的容器,而不是实际对象,并且大多数文件根本不包含类,也不包含类和其他代码。当您的所有文件仅包含一个类而没有其他内容时,这没有任何意义。
如果要遵循该模式,则必须使用interface-foo.phptrait-bar.php。这不仅看起来可笑,而且使自动加载变得比必要的难。

分隔名称空间和类/接口/特征名称的最简单方法是(根据我的经验)是将名称空间分配给目录名称,将类名称分配给文件名称。这使得将请求的类映射到自动加载器中的给定文件结构非常容易:只需转换\/,追加.php并加载文件。

这也使缓存查询变得容易:对于每个目录/名称空间,您可以在首次请求该目录时获取所有现有文件,对于以后的调用,您可以重用该文件名列表,而无需file_exists()每次都进行。


4
换句话说:使其与PSR兼容:)
kaiser

2

我为此要求制作了一个类,它与PSR-4兼容并遵循Wordpress编码标准。

您可以在这里到达:https : //github.com/pablo-pacheco/wp-namespace-autoloader

解释就在那里,但基本上是作曲家的依赖。您只需要在项目中要求它即可:

"require": {    
    "pablo-pacheco/wp-namespace-autoloader": "dev-master"
}

然后叫课

<?php
new \WP_Namespace_Autoloader( array(    
    'directory'   => __DIR__,       // Directory of your project. It can be your theme or plugin. __DIR__ is probably your best bet.    
    'namespace'   => __NAMESPACE__, // Main namespace of your project. E.g My_Project\Admin\Tests should be My_Project. Probably if you just pass the constant __NAMESPACE__ it should work     
    'classes_dir' => 'src',         // (optional). It is where your namespaced classes are located inside your project. If your classes are in the root level, leave this empty. If they are located on 'src' folder, write 'src' here 
) );

1

我通常会选择您的后半部分:

  • 使用名称空间作为文件夹级别
  • 完全使用替代命名方案,例如PSR

如果使用作曲家注册PSR-4自动加载器,则可以与WP命名约定保持一致。映射到可以包含下划线的文件夹的命名空间,其名称类似于类的文件也可以包含下划线。喜欢:

<Namespace_Dir>/Class_Name.php

当WP移至php 5.3+时(最终必须发生,对吧?!),需要更新准则。由于不建议使用PSR-0,因此,如果不需要,至少应建议使用PSR-4。


0

pablo-sg-pacheco的解决方案为我工作,依靠composer自动加载,但与WordPress编码标准兼容,但是Github存储库的网址为:

https://github.com/pablo-sg-pacheco/wp-namespace-autoloader

包名称为:

"require": {    
    "pablo-sg-pacheco/wp-namespace-autoloader": "dev-master"
}

最后,由于该软件包在packagist上不可用,因此您还需要将以下内容添加到composer.json中:

"repositories": [{
    "type": "vcs",
    "url": "https://github.com/pablo-sg-pacheco/wp-namespace-autoloader"
}] 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.