【问题标题】:string arrays within strings字符串中的字符串数组
【发布时间】:2015-01-23 09:47:01
【问题描述】:

为什么这是编译错误:

<?php
class Bean
{
    public $text = array("123", "456");
    public $more = array("000 {$this->text[0]} 000", "--- {$this->text[1]} ---");

}

?>

编译器说PHP Parse error: syntax error, unexpected '"'

如何在其他数组中使用我的文本数组?

【问题讨论】:

  • 第 5 行应该是 public $more = array("000 {" . $this-&gt;text[0] . "} 000", "--- {" . $this-&gt;text[1] . "} ---");
  • 这不起作用。我检查了ideone
  • 我不认为你可以让它与当前版本的 php 一起工作。尽管在最新的 php 版本中已经删除了一些关于“必须是 const 值”规则的限制......像这样? ……我不这么认为。见php.net/manual/migration56.new-features.php“常量表达式”
  • 您应该能够动态填充数组。这很有趣。我想知道为什么这不起作用。

标签: php arrays


【解决方案1】:

如前所述,您不能(直接)使用当前版本的 php。即使是 php 5.6 的新功能也不允许这样做,请参阅http://php.net/manual/en/migration56.new-features.php
但是让我们假设您对此有有效的兴趣,例如在类的更具声明性的部分中保留/分组某些内容,而不是将其隐藏在一堆代码中的某处,您可以做一些事情(也许“有点”更复杂;-))像

<?php
class Bean
{
    public $text = array("123", "456");
    public $more = array('000 %1$s 000', '--- %2$s ---');

    public function Bean() {
        foreach($this->more as $k=>&$v) {
            $v = vsprintf($v, $this->text);
        }
    }
}

$b = new Bean;
print_r($b->more);

【讨论】:

  • 这个“更复杂一点”的答案很有趣。我在哪里可以找到关于 %1$s 到底是做什么的文档?
  • vsprintf 可以使用双引号吗? @penu:在PHP的文档中搜索vsprintfsprintf
  • 格式记录在docs.php.net/sprintf at/after“格式字符串支持参数编号/交换[...]”
  • sprintf() 和 vsprintf() (也没有 any 其他函数?)都不关心单引号或双引号字符串文字。这种魔法发生在函数调用之前,并且函数本身只是获得 a 字符串的(内部)表示,无论该表示是如何存在的。
  • 附带说明:我不知道这是否是个好主意。在最近的一个项目中,我有一些类似的东西......并决定通过代码生成(具有自定义构建步骤)而不是“在”代码中来解决它。它上面有某种代码气味,但我现在不能把手指放在它上面......只是一种感觉。
【解决方案2】:

你在那一行做了什么:

public $more = array("000 {$this->text[0]} 000", "--- {$this->text[1]} ---");

在 PHP 中不起作用。

http://php.net/manual/en/language.oop5.properties.php

您可以在此处查看该示例中属性的有效值和无效值。因此,如果您使用双引号 PHP 尝试解析字符串。

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.double

所以你必须用' 替换你的" 然后它应该可以工作

public $more = array('000 {$this->text[0]} 000)', '(--- {$this->text[1]} ---)');

您可以做的是在该变量中设置一个占位符,并在需要之前将它们替换为 vsprintf

【讨论】:

  • 所以基本上我不能在这些字符串中使用变量?
  • You can only set scalar values.,这不是真的。数组不是标量,但你仍然可以使用它。
  • 是的,抱歉,用错词了。我试图在文档中找到描述它的部分,但我找不到它。
【解决方案3】:

你可以这样做:

class Bean
{
public $text = array("123", "456");

public function fillMore () {
    $more = array();
    $more[0] = "000 ".$this->text[0]." 000";
    $more[1] = "000 ".$this->text[1]." 000";

    var_dump($more);
}
}

$bean = new Bean();
$bean->fillMore();

或者,您也可以尝试在构造函数中填充$more。 这将在您初始化课程时为您提供$more

【讨论】:

    猜你喜欢
    • 2019-06-16
    • 2015-10-22
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2018-04-13
    相关资源
    最近更新 更多