除了PHP字符串文字语法之外,还有更多的机制可以在字符串中替换占位符。一个相当常见的方法是sprintf
:
$str = 'This is a %s';
$a = 'test';
echo sprintf($str, $a);
有很多其他更或多或少专业的模板语言。选择你最喜欢的那个。
sprintf
?无论如何,这仍然听起来像您正在寻找一个模板语言。也许类似 Mustache 或 Twig 的东西可以满足您的需求。 - deceze"{$a->content}"
,那么您将如何动态地将其与正确的变量匹配?字符串文本插值之所以起作用是因为它直接写在源代码中,因此您可以确保变量可用并将它们与字符串插值匹配。但是,如果变量和字符串来自不同的来源,正确地将它们匹配起来几乎是不可能的(或者至少非常困难)。 - deceze$data
)调用监听对象,并在使用 eval()
时,监听器从数组中获取该消息。由于 $data
是函数参数之一并且已经在作用域中,因此当它评估类似 'The content is {$data->getContent()}'
的输出时,输出类似于“内容是somecontent”。这样讲清楚吗? - Parham Doustdar$this->logger->log('User with id ' . $data->getId() . ' has signed up.');
这样内容的函数? - Parham Doustdar你听说过 strtr()
吗?
它非常适合这个目的,非常有用,可以创建包含来自数据库的信息的动态HTML内容。
给定以下字符串:
$str = 'here is some text to greet user {zUserName}';
strtr()
解析它:$userName = 'Mike';
$parsed = strtr($str,array('{zUserName}'=>$userName));
echo $parsed; // outputs: 'here is some text to greet user Mike'
< p >虽然在某些方面中,sprintf
更快,但strtr
允许您以更友好的方式控制替换内容的位置(例如,sprintf
无法很好地处理包含100个占位符的非常长的字符串)。
'这里是一些文本,显示了{zWhatever}的值'
这样有一个字符串会更清晰,然后用你想要的任何内容替换它。这也更加可用,并且可以做你想要的事情,好好考虑一下。你不需要在字符串中调用所有这些内容。 - Félix Adriyel Gagnon-Grenier这里有一个可能的解决方案。我不确定在你特定的情况下是否适用,但它肯定可以减少对于如此多的单引号和双引号的需求。
<?php
class a {
function b() {
return "World";
}
}
$c = new a;
echo eval('Hello {$c->b()}.');
?>
'The value of the property is {$object->getRelatedObject()->getProperty()}'
),并同时将 $object 传递进去,得到类似 "The value of the property is somevalue." 的结果,或者我需要自己编写这个函数? - Parham Doustdar$object = new functionName($Property);
在这个例子中,你的 functionName
将处理 $Property
变量,并根据你使用对象调用的任何函数进行返回。因此,如果你调用 $object->getProperty();
它将返回相应的值,就像其他面向对象的层次结构一样。 - Eric Mayfield