PHP:如何创建一个在内部变量发生变化时发生变化的插值字符串?

时间:2017-05-21 10:06:20

标签: php

我想在变量中存储一个句子。句子包含另一个变量。

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字符串,当内部字符串发生变化时会发生变化?

3 个答案:

答案 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);
    }
}

Try it online

答案 2 :(得分:0)

你想做什么是不可能的PHP。 创建一个返回字符串的函数。

func getSentence($name) {
  return "Your name is $name";
}