【问题标题】:PHP dynamic string update with referencePHP动态字符串更新参考
【发布时间】:2013-04-17 14:09:58
【问题描述】:

有没有办法做到这一点:

$myVar = 2;
$str = "I'm number:".$myVar;
$myVar = 3;

echo $str;

输出将是:"I'm number: 3";

我想要一个字符串,它的一部分就像一个指针,它的值将通过对引用变量的最后修改来设置。

例如,即使我这样做:

 $myStr = "hi";
 $myStrReference = &$myStr;
 $dynamicStr = "bye ".$myStrReference;
 $myStr = "bye";
 echo $dynamicStr;

这将输出“bye hi”,但由于上次更改,我希望它是“bye bye”。我认为问题在于将指针连接到字符串时,指针的值是使用的值。因此,无法使用连接后设置的值输出字符串。

有什么想法吗?

更新$dynamicStr 将被附加到$biggerString,最后$finalResult ($biggerString+$dynamicStr) 将回显给用户。因此,我唯一的选择是做某种echo eval($finalResult),其中$finalResult 内部有一个echo($dynamicStr)$dynamicStr='$myStr'(如Lawson 所建议),对吧?

更新:

$myVar = 2;
$str = function() use (&$myVar) {
    return "I'm number $myVar";
};

$finalStr = "hi ".$str();
$myVar = 3;
echo $finalStr; 

我希望输出:“嗨,我是 3 号”而不是“嗨,我是 2 号”......但它没有。

【问题讨论】:

  • 不能在某个步骤使用变量而不声明它或使用未来值...
  • 也许sprintf 会满足您的需求……? php.net/manual/en/function.sprintf.php
  • 没有。一旦一个变量被“扩展”并且它的值被嵌入到一个字符串中,这个 var 和它被插入的字符串之间的链接就被切断了。如果 var 稍后更改其值,PHP 不会跟踪“原始”字符串并重新执行连接代码。

标签: php string pointers reference


【解决方案1】:

这里的问题是,一旦为变量分配了一个值(在您的情况下是一个字符串),它的值在再次修改之前不会改变。

你可以使用匿名函数来完成类似的事情:

$myVar = 2;
$str = function() use (&$myVar) {
    return "I'm number $myVar";
};

echo $str(); // I'm number 2
$myVar = 3;
echo $str(); // I'm number 3

当函数被分配给$str 时,它使变量$myVar 可以从内部访问。在任何时间点调用它都会使用$myVar 的最新值。

更新

关于你的最后一个问题,如果你想进一步扩展字符串,你可以创建另一个包装器:

$myVar = 2;
$str = function() use (&$myVar) {
    return "I'm number $myVar";
};

$finalStr = function($str) {
    return "hi " . $str();
}

$myVar = 3;

echo $finalStr($str);

【讨论】:

  • 你应该通过引用传递变量:...use ( & $myVar )...
  • 问题是字符串将被连接到一个更大的字符串,最后一个回显会将最终结果输出给用户,这样就不可能了,不是吗?
  • @Jack,你测试过你的代码吗? use 子句在子句声明时捕获$myVar 的值。事实上,它并没有按照你的要求做。
  • @Jack 我认为 linepogl 是对的......我必须使用 (&$myVar) 来让你的示例工作
  • @linepogl 好吧,我的错。没有测试它:) 答案已更新。我太习惯 JavaScript 语义了。
【解决方案2】:

这比我以前简单一点。单引号告诉 PHP 不要将 $myVar 转换为值。

<?php
$myVar = 2;
$str = 'I\'m number: $myVar';
$myVar = 3;

echo eval("echo(\"$str\");");
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    相关资源
    最近更新 更多