【问题标题】:Check if the parameters passed to a method is one of the constants defined in a class?检查传递给方法的参数是否是类中定义的常量之一?
【发布时间】:2017-12-25 18:09:51
【问题描述】:

我正在寻找一种方法来了解传递给方法的参数是否是在特定类中定义的常量。例如:

class MyClass {
    const CONSTANT = 4;
    const ANOTHER_CONSTANT = 5;

    public function aMethod ($a_CONSTANT) {
        // function code
   } 
 } 

$myClass = new MyClass();
$myClass->aMethod(MyClass::CONSTANT); // Fine
$myClass->aMethod(MyClass::ANOTHER_CONSTANT) ; // Still okay
$myClass->aMethod(4); // Not okay
$myClass->aMethod(OtherClass::VALUE); // No way

在上面的代码中,对aMethod 的前两次调用是可以接受的,但我希望解析器在第三次和第四次调用aMethod 时给出错误,因为传递给aMethod 的值不是常量特定类的(MyClass,在这种情况下)。是否有语法来输入aMethod 中的参数以实现我想要的?

【问题讨论】:

  • 没有。您需要根据这些常量手动检查传递的值。常量只是一个值的容器。当你将一个常量传递给一个方法时,它只是被传递的值。该类不知道,也不应该知道该值来自外部范围。一切以实际价值为准。

标签: php class oop constants type-hinting


【解决方案1】:

当您传递“一个常量”时,您不是在传递常量本身,而是在传递它的值。 MyClass::CONSTANT4 完全是同义词。您可以检测到它们之间没有区别。事实上,编译器在编译时将所有提到的“MyClass::CONSTANT”替换为4。这就是常量。

【讨论】:

  • 嘿,谢谢!我有点想将其限制为仅常量而不是硬编码值,以便当常量更改时,新值会自动反映到所有使用它的地方。
  • 是的,这是一个有价值的事业,但遗憾的是,没有什么可以帮助您的语言。也许存在一些样式检查器可以为此目的解析一些注释注释,但我不知道。
  • 是的!如果我用常量定义一个类OtherClass,比如OC_CONSTANT,它存储值4或5,那么在上面的代码中,我可以像这样调用aMethod$myClass->aMethod(OtherClass::OC_CONSTANT),它的工作方式与来自MyClass 的常量被传递。
猜你喜欢
  • 2020-11-14
  • 2016-08-05
  • 2021-06-02
  • 2012-08-19
  • 2011-08-10
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
相关资源
最近更新 更多