我想在变量中存储一个句子。句子包含另一个变量。
php > $name = "Fred";
php > $sentence = "Your name is {$name}";
php > echo $sentence;
Your name is Fred
如果我更改$name
的值,则句子不变:
php > $name = "John";
php > echo $sentence;
Your name is Fred
但我希望这句话成为“你的名字是约翰”。在PHP中有没有办法我可以创建一个iterpolated字符串,当内部字符串发生变化时会发生变化?
答案 0 :(得分:2)
不,你想要它的工作方式不可能。
其他解决方案:
function mySentence($name) {
return 'Your name is '. $name;
}
sprintf('"Your name is %s', $name);
str_replace('{name}', $name, 'Your name is {name}');
创建将主要作为ValueObject
保存的类class Sentence {
private $sentence;
private $name;
public function __constructor($name, $sentence){
$this->name = $name;
$this->sentence = $sentence;
}
public function changeName($name){
return new Sentence($name, $this->sentence);
}
public function printText() {
return $this->sentence . $this->name;
}
public function __toString(){
return $this->printText();
}
}
然后简单地使用:
$sentence = new Sentence('Fred', "My name is");
echo $sentence;
// My name is Fred
echo $sentence->changeName('John');
// My name is John
这当然是个主意,你有什么选择来解决这个问题。 有了它,您可以添加任何可替换的占位符等。
答案 1 :(得分:1)
扩展"句子作为对象" timiTao's answer的一部分,这里是一个更通用的"模板字符串"你可以用这个类作为起点。
class TemplateString {
// Usage:
// $t = new TemplateString("Your name is {{name}}");
// $t->name = "John";
// echo $t; // Your name is John
private $template;
private $parameters = [];
public function __construct(string $template, array $defaultparams = null) {
$this->template = $template;
if( $defaultparams) $this->parameters = $defaultparams;
}
public function __set($k,$v) {
$this->parameters[$k] = $v;
}
public function __get($k) {
if( array_key_exists($k,$this->parameters)) {
return $this->parameters[$k];
}
return null;
}
public function __toString() {
$words = $this->parameters;
return preg_replace_callback("/\{\{(\w+)\}\}/",function($m) use ($words) {
if( array_key_exists($m[1],$words)) return $words[$m[1]];
return $m[0];
},$this->template);
}
}
答案 2 :(得分:0)
你想做什么是不可能的PHP。 创建一个返回字符串的函数。
func getSentence($name) {
return "Your name is $name";
}