问题 跨越多行的PHP类常量字符串变量


我希望有一个PHP类的字符串变量,它可用于所有方法。

但是,这个变量很长,所以我想把它分成多行。

例如,

$variable = "line 1" .
            "line 2" .
            "line 3";

但上面不起作用。

我尝试过EOD,但是在课堂上不允许EOD。当我在课外声明它时,我无法从类中访问该变量。

什么是最好的方法?


1952
2018-04-09 04:43


起源

我没有看到任何理由为什么以上不起作用。你能准确发布你的代码吗?谢谢。 - Ivo Sabev
你可以跨越多行来跨越变量,你可以发布代码以及它究竟是如何工作的吗? - Anthony Forloney
您可以使用。访问类外的变量 global 关键字或 $GLOBALS 顺便说一句,超全球阵列。当然,我不推荐这个。 - Zarel
另外还有一件事,PHP无法做到这一点,地球上的其他所有语言都可以无需支持。 - ThorSummoner


答案:


如果你正在使用 PHP> = 5.3,你可以使用 HEREDOC语法 声明你的字符串:

class MyClass {
    public $str = <<<STR
this is
a long
string
STR;

}

$a = new MyClass();
var_dump($a->str);

但是这个 :

  • 只有PHP> = 5.3才能实现
  • 并且字符串不能包含任何变量
    • 这是因为字符串的值必须在编译时知道
    • 哪,顺便说一句,解释为什么连接,用 .,将无法工作:它是在执行时完成的。

另一个缺点是,这将在字符串中添加换行符 - 这可能是也可能不是坏事。


如果你正在使用 PHP <= 5.2 :

你不能这样做;一个解决方案可能是在类的构造函数中初始化字符串:

class MyClass {
    public $str;
    public function __construct() {
        $this->str = <<<STR
this is
a long
string
STR;
    }
}

(同样没有换行)

或者,在这里,您可以进行字符串连接:

class MyClass {
    public $str;
    public function __construct() {
        $this->str = 'this is' .
                     'a long' .
                     'string';
    }
}

(这样,没有新行)


否则,你可以有一个被单引号或双引号括起来的字符串,并把它放在几行上:

class MyClass {
    public $str = "this is
a long
string";
}

(这里,再次,你将在结果字符串中有换行符)


10
2018-04-09 04:48



这是因为字符串的值必须在编译时知道  - 错了。 - user187291
@stereofrog fr2.php.net/manual/en/language.oop5.properties.php 说 此声明可能包括初始化,但此初始化必须是常量值 - 也就是说,它必须能够在编译时进行评估  - 这真的错了吗? - Pascal MARTIN
是的,手册错了。 - user187291
哦你有任何使用非常量值初始化类属性的工作示例吗? - Pascal MARTIN
我发布过一次,基本上是这样的: define('foo',rand()); class x { var $bar=foo; }; - user187291


$var = "this is a really long variable and I'd rather have it " .
 "span over multiple lines for readability sake. God it's so hot in here " .
 "can someone turn on the A/C?";
echo $var;

哪个输出:

这是一个非常长的变量,为了便于阅读,我宁愿让它跨越多行。上帝这么热,在这里可以有人打开A / C吗?

你现在使用的是什么 字符串连接运算符。如果您可以发布有关您的问题的更多信息,一些代码或可能进一步解释 怎么样 它不起作用。更多信息将引导您获得更好的答案。


2
2018-04-09 04:51



这将适用于方法内的变量;但是它适用于一个类属性吗? (我相信这是个问题) - Pascal MARTIN
您好,正如Martin所说,我想声明类的变量OUTSIDE,然后在方法中访问它。 $ var =“line1”。 “2号线”;如果我在一个函数中声明它,但是如果我在外面执行它,则不起作用。它甚至不会让我。 - ericbae
啊,我还没试过,如果需要,我可以在下班回来时测试一下。但似乎你已经找到了解决方案。 - Anthony Forloney


我使用的是PHP 5.5.9,并且只遇到了类似的问题 class 常量。我想使用一个有点长的字符串作为常量,但我不想要:

  • 真的很长的代码行
  • 在断点处出现在文本中的换行符
  • 财产是可变的
  • 在课外无法进入的财产

我认为这里的解决方案是在Laravel 5脚手架中做了很多事情以及为什么他们一直这样做让我困惑到现在为止。他们做的是这样的:

public static function getLongPropertyString()
{
    return 'A a string that can be arbitrarily long and contain as ' .
        'many breaks in the code as you want without line breaks ' .
        'appearing in the resulting string.';
}

这种方法提供了一个 一成不变 串。你不是通过创建一个严格的 protected/private 具有getter的变量,因为它在内部仍然是可变的。只更改代码或覆盖可以更改此字符串。另一位专业人士认为,将其设为静态可以为每个类提供一个“实例”。

不幸的是,现在你的代码就是 Class::getProperty() 而不仅仅是 Class::property。另一个缺点是每次调用函数时都会进行连接,但根据你使用它的方式,这个成本通常可以忽略不计。

如果PHP编译器能够识别出只在编译时已知的值的连接操作可以在编译时运行并且结果被替换(比我更了解的知识,为什么会这样),那将是很酷的。


0
2018-06-18 21:53



如果您不添加setter并且没有方法更改它,则除非您更改代码,否则私有变量也是不可变的。但是从方法中返回字符串 威力 对你正在做的事情有一个更明确的意图。 - Michał Tatarynowicz
我同意。我只是建议这个表单,因为没有隐式方法来更改字符串而不是故意重写方法或更改内部文本,即更改字符串的唯一方法是覆盖方法或更改其中的代码。就此而言 接近 因为我们已经删除了无意的修改方法,所以它是不可变的。 - jeteon