我可以用PHP中的另一个变量修改字符串中的变量吗?

时间:2016-10-12 00:01:46

标签: php variables

$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);

2 个答案:

答案 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?

演示:https://3v4l.org/XmUEZ

这个类基本上存储了对$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";

https://3v4l.org/KJTKj

(Ab)使用闭包来保存引用。可能更糟糕。

为什么这是一个坏主意,你问?

仅考虑以下陈述:

$pet = 'goldfish';

这是一个简单的任务。大多数程序员都认为这种说法没有副作用。这意味着除了创建新变量之外,此语句在执行流程中不会改变任何内容。

我们的MyStringmysprintf违反了此假设。 什么应该是一个简单的任务,现在有副作用。它以最糟糕的方式违反了程序员的期望。

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

所以,坚持功能方式:)