$pet ='dog';
$action='My '. $pet . 'likes to run.';
//The part I would like to modify
$pet ='cat';
//Modify the $pet variable inside the $action variable
//after it has been defined.
echo $action;
这将输出:我的狗喜欢跑
我可以输出:我的猫喜欢跑
我也尝试过:
$pet ='dog';
$action=sprintf('My %s likes to run.', $pet);
$pet ='cat';
echo $action;
我知道这可以通过创建一个带有如下参数的函数来实现。但我是一个php初学者,并对其他方法感到好奇。
function action($pet = "dog") {
$p = 'My'. $pet . 'likes to run.';
return $p;
}
$pet = 'cat';
echo action($pet);
答案 0 :(得分:3)
嗯,我知道你可能不是在寻找这个,但是已经很晚了,我很无聊。
免责声明:这是坏主意。
class MyString
{
private $format, $pet;
public function __construct($format, &$pet)
{
$this->format = $format;
$this->pet = &$pet;
}
public function __toString()
{
return sprintf($this->format, $this->pet);
}
}
$myString = new MyString('This is my little %s, cool huh?', $pet);
$pet = 'cat';
echo $myString."\n";
$pet = 'dog';
echo $myString."\n";
$pet = 'goldfish';
echo $myString."\n";
输出:
This is my little cat, cool huh?
This is my little dog, cool huh?
This is my little goldfish, cool huh?
这个类基本上存储了对$pet
变量的引用。因此,当更新$pet
变量时,类中的引用也会更新。
另一个好的衡量标准:
function mysprintf($format, &$variable)
{
return function() use ($format, &$variable) {
return sprintf($format, $variable);
};
}
$print = mysprintf('This is my little %s, cool huh?', $pet);
$pet = 'cat';
echo $print()."\n";
$pet = 'dog';
echo $print()."\n";
$pet = 'goldfish';
echo $print()."\n";
(Ab)使用闭包来保存引用。可能更糟糕。
为什么这是一个坏主意,你问?
仅考虑以下陈述:
$pet = 'goldfish';
这是一个简单的任务。大多数程序员都认为这种说法没有副作用。这意味着除了创建新变量之外,此语句在执行流程中不会改变任何内容。
我们的MyString
或mysprintf
违反了此假设。 什么应该是一个简单的任务,现在有副作用。它以最糟糕的方式违反了程序员的期望。
答案 1 :(得分:2)
您正在尝试创建动态字符串变量,这在php
暂时无法实现。您可以使用已经实现的功能方法:)。
function action($pet = "dog") {
$p = 'My'. $pet . 'likes to run.';
return $p;
}
$pet = 'cat';
echo action($pet);
如果你使用下面的方法,遗憾的是它只会覆盖打印部分而不是我们需要重新分配变量的值。
$pet ='dog';
$action=sprintf('My %s likes to run.', $pet);
$pet ='cat';
echo $action;
所以,坚持功能方式:)