【问题标题】:Converting a constant array to a constant string将常量数组转换为常量字符串
【发布时间】:2019-05-29 13:16:22
【问题描述】:

我有这个代码:

const TYPE_A = 'a';
const TYPE_B = 'b';
const TYPE_C = 'c';

const TYPE_ARRAY = [
TYPE_A,
TYPE_B,
TYPE_C,
];

我使用 TYPE_ARRAY 通过 in_array() 来检查类型是否有效。但我还需要做一个正则表达式检查,但我不能直接使用这个数组。我需要一个格式为:“a|b|c”的字符串,相当于:

implode('|', TYPE_ARRAY);

但不要这样做:

const TYPE_REGEX_STR = "a|b|c";

我想知道是否无法使用正则表达式将 const TYPE_ARRAY 自动转换为常量。所以是这样的:

const TYPE_REGEX_STR = implode('|', TYPE_ARRAY);

我知道最后一个例子是不可能的,但是有没有其他方法可以做到这一点?

这可能看起来很傻,但是当您有一个具有多种可能类型的数组时,最好基于 const TYPE_ARRAY 创建 const TYPE_REGEX_STR 而不是单独定义它。这样添加新类型会更容易:只需将其添加到数组中,正则表达式字符串就会自动生成。

顺便说一句,我需要 TYPE_REGEX_STR 作为常量,因为 Symfony 可以在路由要求中使用常量,但不能使用静态函数。

【问题讨论】:

标签: php


【解决方案1】:

你可以使用define

<?php

const TYPE_A = 'a';
const TYPE_B = 'b';
const TYPE_C = 'c';

const TYPE_ARRAY = [
TYPE_A,
TYPE_B,
TYPE_C,
];

define ( 'TYPE_REGEX_STR' , implode('|', TYPE_ARRAY) );

echo TYPE_REGEX_STR;

【讨论】:

  • 这很有效,但似乎 Symfony 只能在路由要求中使用类常量,因此在运行时使用定义(例如在控制器类的 __contruct 函数中)不起作用。遗憾!但是感谢您的帮助。
【解决方案2】:

你会想要使用定义

define( 'TYPE_REGEX_STR', implode('|', TYPE_ARRAY) );

【讨论】:

  • 谢谢,听起来不错,但问题是 Symfony 只能在路由要求中使用类常量,并且由于在运行时使用了 define(),所以我不能为此使用它对不起。
  • 在这里查看。也许你可以创建一个类和方法stackoverflow.com/questions/18079131/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
相关资源
最近更新 更多