在PHP中处理常量的最佳方法

时间:2014-08-26 08:47:53

标签: php design-patterns

假设我的类有一些采用true / false值的方法。例如:

class MyClass
{
    public function hasSomething($value)
    {
        $something = $value;
    }
}

$ $可以是真/假。如果我在代码中的某处调用它,那就不是很好了:

$MyClass->hasSomething(true);

从方法名称和值true可能有点难以确定代码正在做什么。所以我喜欢使用常量来使它更好。

我一直在这样做:

abstract class MY_CLASS_CONSTANTS
{
    const HAS_THING_ONE = true;
    const NO_THING_ONE = false;
}

现在,当我致电MyClass->hasSomething时,我可以转到MyClass->hasSomething(MY_CLASS_CONSTANTS::HAS_THING_ONE),表达性更强,并且应该让代码更容易理解。

我喜欢将const放在一个类中的想法,因为那些consts应该与之一起使用变得更加明显。

这是个坏主意吗?有没有更好的方法呢?其他人如何处理这个?

2 个答案:

答案 0 :(得分:1)

为什么不创建一个更简洁,更明确的方法:

MyClass->hasOneThing();
MyClass->hasNothing();

在你的课堂上,你可以自由委派:

class MyClass
{
    private function hasSomething($value) {$something = $value;}
    public function hasOneThing() {$this->hasSomething(true);}
    public function hasNothing() {$this->hasSomething(false);}
}

我不使用常数;如果那个小案例,特别是当参数的类型是布尔值时,它们就没用了。

此外,您的方法设计是错误的。如果其名称为hasis,则应返回类似布尔值的内容,而不更新该值。

答案 1 :(得分:1)

使用php类常量是个好主意。

我将举一些让你的代码更易理解和可读的例子,

示例1:(在班级内部)

class Exam
{
    /**
     * available grades
     */
    const GRADE_EXCELLENT   = 'A';
    const GRADE_VERY_GOOD   = 'B';
    const GRADE_MIN_PASS    = 'C';
    const GRADE_CLOSE_FAIL  = 'D';
    const GRADE_FAIL        = 'E';

    private $finalGrade;

    /**
     * one of const - Exam::GRADE_...
     * 
     * @param char $grade
     */
    public function setGrade($grade)
    {
        $this->finalGrade = $grade;
    }
}


$exam = new Exam();
$exam->setGrade(Exam::GRADE_VERY_GOOD);


示例2:(具有单独的课程)

class Exam_Grades
{
    /**
     * available grades
     */
    const EXCELLENT   = 'A';
    const VERY_GOOD   = 'B';
    const MIN_PASS    = 'C';
    const CLOSE_FAIL  = 'D';
    const FAIL        = 'E';
}

$exam->setGrade(Exam_Grades::FAIL);


示例3:(定义常量)

define('EXAM_GRADE_EXCELLENT',  'A');
define('EXAM_GRADE_VERY_GOOD',  'B');
define('EXAM_GRADE_MIN_PASS',   'C');
define('EXAM_GRADE_CLOSE_FAIL', 'D');
define('EXAM_GRADE_FAIL',       'E');

$exam->setGrade(EXAM_GRADE_MIN_PASS);

这种方式也可以使用代码完成,这是使用常量的好习惯。

大多数情况下我更喜欢第一个示例风格,对我来说它确实更有意义,它是你的选择,为你做更好的事情......