【问题标题】:PHP class constant string variable spanning over multiple linesPHP类常量字符串变量跨越多行
【发布时间】:2011-02-06 00:02:46
【问题描述】:

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

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

例如,

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

但以上不起作用。

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

最好的方法是什么?

【问题讨论】:

  • 我看不出有任何理由说明上述方法不起作用。你能准确地发布你的代码吗?谢谢。
  • 你当然可以跨越多行变量,你能发布代码以及它是如何不工作的吗?
  • 顺便说一句,您可以使用global 关键字或$GLOBALS 超全局数组访问类外的变量。当然,我不建议这样做。
  • 再写一件事 PHP 无法做到,而地球上所有其他语言都可以毫不费力地做到这一点。

标签: php variables constants


【解决方案1】:

如果您使用的是 PHP >= 5.3,您可以使用HEREDOC syntax 来声明您的字符串:

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

}

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

但是这个:

  • 仅适用于 PHP >= 5.3
  • 并且字符串不能包含任何变量
    • 这是因为字符串的值必须在编译时知道
    • 顺便说一句,这解释了为什么使用 . 的连接不起作用:它是在执行时完成的。

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


如果您使用的是 PHP :

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

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";
}

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

【讨论】:

  • 这是因为字符串的值必须在编译时知道 - 错误。
  • @stereofrog fr2.php.net/manual/en/language.oop5.properties.php这个声明可能包含一个初始化,但是这个初始化必须是一个常量值——也就是说,它必须能够在编译时被评估——所以这真的错了吗?
  • 哦;你有任何用非常量值初始化类属性的工作示例吗?
  • 我发过一次,基本上是这样的:define('foo',rand()); class x { var $bar=foo; };
  • 哦,我明白了;没有考虑在这种情况下使用定义^^感谢您的注意:-)
【解决方案2】:
$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;

哪些输出:

这是一个非常长的变量,为了便于阅读,我宁愿让它跨越多行。天哪,这里这么热,有人能开空调吗?

您现在可以使用string concatenation operator。如果您可以发布有关您的问题的更多信息、一些代码或进一步解释如何它不起作用。更多信息将引导您找到更好的答案。

【讨论】:

  • 这适用于方法内的变量;但它适用于类属性吗? (我相信这就是问题所在)
  • 你好,正如马丁所说,我想在类的外部声明变量,然后在方法中访问它。 $var = "line1"。 “线2”;如果我在函数内声明它可以工作,但如果我在外面做它就不行。它甚至不会让我。
  • 啊,这个我没试过,下班回来可以测试一下,如果需要的话。不过看来你已经找到了解决办法。
【解决方案3】:

我正在使用 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.';
}

此方法提供一个不可变字符串。您不能通过使用 getter 创建 protected/private 变量来严格做到这一点,因为它在内部仍然是可变的。只有更改代码或覆盖才能更改此字符串。另一个优点是,将其设为静态允许每个类有一个“实例”。

不幸的是,现在您的代码将是 Class::getProperty() 而不仅仅是 Class::property。另一个缺点是每次调用函数时都会进行连接,但取决于你如何使用它,这种成本通常可以忽略不计。

如果 PHP 编译器能够识别出仅在编译时已知的值上的连接操作可以在编译时运行并替换结果(比我知识渊博的人知道为什么会这样),那将是很酷的。

【讨论】:

  • 如果你不添加setter并且没有方法改变它,私有变量也是不可变的,除非你改变代码。但是从方法返回字符串可能可以更清楚地说明你在做什么。
  • 我同意。我只是建议了这种形式,因为没有隐式的方法可以在不故意覆盖方法或更改内部文本的情况下更改字符串,即更改字符串的唯一方法是覆盖方法或更改其中的代码。在这方面它更接近是不可变的,因为我们已经删除了无意修改它的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多