PHP常量命名规范

4

你好,StackOverflow

我正在整理代码并想请教一些关于PHP最佳实践的建议,尤其是在重构我的类时。具体来说,我有一些类常量属于不同的类别,我想知道如何将共享相同目的的常量进行分组的好方法。

例如:

class MySquare {
  // Colors
  const COLOR_GREEN = "green";
  const COLOR_RED = "red";

  // Widths
  const WIDTH_SMALL = 100;
  const WIDTH_MEDIUM = 500;
  const WIDTH_BIG = 1000;

  // Heights
  const HEIGHT_SMALL = 100;
  const HEIGHT_MEDIUM = 300;
  const HEIGHT_BIG = 500;
}

显然这个方法可行,但是在将相关的常量分组时可能有更多的选择,我相信这种方法不如大多数方法。你会怎么做呢?


这基本上是我做的方式。 - Naftali
较新的推荐方法是使用命名空间而不是类来保存一系列值。类方法虽然可行,但滥用了面向对象编程系统。 - Marc B
@MarcB 这个建议让我很感兴趣,但不幸的是我不确定它实际上会是什么样子。(如果你没有时间回答,那么请不要强求答案,但如果你有一分钟,并且能给一个例子,那就太好了)。在此期间,我会阅读一些关于PHP命名空间的文章。 - slifty
3个回答

4

有许多PHP规范,它们互相矛盾。但是我使用类似的符号表示法,尽管我喜欢将常量按类分组,因此我会有一个名为Height(或MySquare_Height)的类,其中包含常量。这样,我可以将其用作其他语言中的Enum。特别是当您使用带有突出显示功能的编辑器时。

<?
abstract class MySquare_Color
{
  const GREEN = 'Green';
  const RED = 'Red';
}

abstract class MySquare_Height 
{
  const SMALL = 100;
  const MEDIUM = 300;
  const BIG = 500;
}

如果您使用的是PHP 5.3,您可以将类名命名为Color和Height,并将它们放在MySquare命名空间中:
<?php
// Namespace MySquare with subnamespace Width containing the constants.
namespace MySquare\Width
{
    const SMALL = 100;
    const MEDIUM = 300;
}

namespace
{
  // Refer to it fromout another namespace
  echo MySquare\Width\SMALL;
}


?>

根据要求添加了命名空间解决方案。 - GolezTrol

3
作为一种选择,您可以创建一些接口,在这些接口中定义常量。这样会增加代码量,但是代码会更有组织性 :)
interface IColorsConstants
{
    const COLOR_GREEN = "green";
    const COLOR_RED = "red";
}

interface IWidths
{
    const WIDTH_SMALL = 100;
    const WIDTH_MEDIUM = 500;
    const WIDTH_BIG = 1000;
}

interface IHeights
{
    const HEIGHT_SMALL = 100;
    const HEIGHT_MEDIUM = 300;
    const HEIGHT_BIG = 500;
}

class MySquare implements IColorsConstants, IHeights, IWidths
{

}

不错的解决方案,而且还有效。可惜我的工具(PHPDesigner 7)的代码补全功能无法识别接口常量,只能识别类常量。:( - GolezTrol
1
@GolezTrol 尝试使用NetBeans或PhpStorm。我希望PHP Designer有一天能够成为这些IDE的替代品。 - OZ_

1

由于PHP没有枚举,您的方法是完全正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接