【问题标题】:What is the best ways to build a string via a function in php?通过 php 中的函数构建字符串的最佳方法是什么?
【发布时间】:2018-12-31 09:37:52
【问题描述】:

所以也许我只是脑子有问题,idk。但这似乎应该有效,但它没有。

意图

在整个页面中构建一个字符串,以便稍后在应用页面中使用。

问题

在使用字符串的结果值之前,我们如何以一种可以通过函数多次添加的方式存储字符串?有没有比使用变量更好的方法来使用函数?

一个无效的例子

<?php
$testNG = "";
function testNG($tng){
  $testNG .= $tng;
  return $testNG;
}
testNG("hello!!");
?>
<h2><?= $testNG; ?></h2>

与往常一样,感谢大家为使在线世界变得更加高效的贡献!

编辑

这样做的一个示例目的是允许将 Javascript 聚合到一个变量中,以便可以在它影响的元素附近创建它,然后放置在 &lt;/body&gt; 之前的部分中

<div id="rating"></div>
<?php testNG("$('#rating').rating();"); ?>
<p>blah blah</p>
...

...
</footer>
<?php
if($testNG != ""): ?>
<script>
<?= $testNG; ?>
</script>
<?php endif; ?>

【问题讨论】:

  • 听起来您需要一个对象或数组,而不是添加到字符串中。添加到字符串会使代码变得困难,因为一旦你想做一些特定的事情,你就必须把你的代码放在中间,或者任何地方,以使你的结果适合字符串。那是一种非常难闻的气味
  • 如果你解释你真正的原因和代码,而不是一个没有意义的假的,也许我们可以建议更好的方式,或者至少是你想要的方式。实际上,您已经创建了一个可以执行您想要的功能:)
  • 你会认为它做了我想要的,但是在测试文件中,变量没有被附加到。它仅保存函数之前的初始值。这就是为什么我觉得自己脑子有问题。
  • 使用示例更新
  • 啊,我明白了,你这么说,$testNG 没有定义在函数的范围内,只是在函数的范围之外。您可以在函数中创建一个全局变量(不是很好),通过引用传递,传入另一个参数 - 所以您要附加的 var 和要附加的值 - 或者只是将值附加到没有函数的 var 中。我认为这个功能是矫枉过正的。例如$theVar = ''; $theVar .= 'my new value'; $theVar .= 'another thing';

标签: php html function functional-programming


【解决方案1】:

一种方法是在函数中将$testNG 声明为static,而不是使用全局变量。来自PHP manual

静态变量只存在于局部函数作用域中,但当程序执行离开此作用域时,它不会丢失其值。

因此,每次调用该函数时,它都会将输入添加到已经存在的内容中。

<?php

function testNG($tng = '') {
    static $testNG = '';
    return $testNG .= $tng;
}

testNG("hello!!");
testNG(" world!!");
testNG(" etc.");
?>
<h2><?= testNG(); ?></h2>

Demo at 3v4l.org

【讨论】:

  • 谢谢,这正是我个人需要的。但是,如果社区投票给另一个答案更高的答案,那么我会做出更受欢迎的答案。不过,这绝对是我想要的!
  • 请注意,无法将其重置为初始的空字符串。您不能在程序中多次执行此操作。也许当它在没有参数的情况下被调用时,你可以在返回它的值时清除变量。
  • 我删除了我的评论,你是对的 :) 尽管“IMO”仍然不是解决这个问题的好方法。我必须在那个函数上运气好才能看到它在做什么,并且它仍然按照函数被调用的顺序将数据添加到单个 var 中。还有更清晰和优雅的方法可以做到这一点,再次 imo :)
  • @James 我尊重你的意见。老实说,我不会发现这样的功能特别有用。由于它的线性,它相当有限,尽管可以按照 Barmar 的建议进行一些改进。我真的只是想指出另一种可能可行的方式来避免使用全局变量。
  • 是的,不用担心只是讨论它。我投了赞成票。它确实很好地解决了这个问题:)
【解决方案2】:

另一种方法,稍微介绍一下 OOP,可能是这样的:

<?php

 class overSimplifiedJSViewHelper 
 {

     protected $_strOut;

     public function append($strIn)
     {
         $this->_strOut = $this->strOut . $strIn;
     }

     public function clear()
     {
         $this->_strOut = '';
     }

     public function getStrOut()
     {
         return $this->_strOut;
     }
 }


 $jsOut = new overSimplifiedJSViewHelper;

 $jsOut->append("$('#rating').rating();");
 $jsOut->append("alert('foo)");

 echo $jsOut->getStrOut();

我觉得你问题的症结在于variable scope

OP 可能还想查看 PHP 的 output buffering

附:当您开始了解有关范围和如何保持理智的更多信息时,也许可以查看诸如注册表模式之类的设计模式,而不是将所有内容都放在全局空间中……我们记得“注册全局变量”…… 检查其他人的代码,特别是 PHP 框架是学习的好方法!

【讨论】:

  • 我非常感谢这些提示。我肯定会玩弄你的例子。一个类最有意义,因为它可以多次用于不同的目的。
  • _$strOut 应该是 $_strOut,但是 PSR2 建议不要使用这种前缀。
  • 谢谢。已更正。
【解决方案3】:

之后添加更多内容时,使用字符串会很困难。而是使用数组或对象。

您可以像这样在页面顶部定义一个数组()或对象:

$testNG = array();

然后,您可以在任意位置向数组添加值:

$testNG[] = $tng; or
$testNG['key'] = $tng;

否则,如果您想继续使用您的字符串,请将变量添加为函数中的全局变量:

function testNG($tng){
   global $testNG;

   $testNG .= $tng;
   return $testNG;
}

【讨论】:

    【解决方案4】:

    您有很多答案可以完美地解决您的确切要求。然而只是从另一个角度看

    您请求了一个函数,为此您可以添加另一个参数、通过引用传递、使用全局变量或使用静态变量。全局变量不好,这是众所周知的。但是其他方式真的有必要吗?我不会添加另一个参数或通过引用传递,因为它们与我觉得在使用静态时存在同样的矫枉过正,因此将使用它作为所有函数方法的示例:

    function appendValueToVar($newValue = '')
    {
        static $theValue = '';
    
        return $theValue .= $newValue;
    }
    
    appendValueToVar('value1');
    // More code
    appendValueToVar(' - value2');
    // More code
    
    echo appendValueToVar();
    

    这种方法的问题是你有一个乍一看并不明显的功能。此外,您调用相同的函数将值附加到静态变量并检索它。这就像一个 getter 和 setter 合二为一,有点臭,违反了 SRP(和其他原则)。

    你可以看到这个名字,我叫它appendValueToVar,但我应该叫它getValueFromVar吗?还有什么?它并不真正知道自己想成为什么。

    不过,除了原则等之外,主要的一点是,与简单地附加到变量相比,这如何节省任何时间或精力,这很简单,意图很明显?

    $theValue = '';
    // More code
    $theValue .= 'value1';
    // More code
    $theValue .= 'value2';
    // More code
    echo $theValue;
    

    对我来说,为此使用函数是大材小用,会给视觉和意图带来很大的复杂性和潜在的混乱,更需要维护等等。

    如果你想让你的代码变得更好,那很好,但是(我认为..)一个复杂的功能很少,但实际上并不是最好的方法。这并没有真正的改进。

    编写一个非常简单的类来获取数据并将其设置为对象。你想要的并不难:

    class YourValue
    {
        private $value = '';
    
        public function setValue($newValue)
        {
            $this->value .= $newValue;
        }
    
        public function getValue()
        {
            return $this->value;
        }
    }
    
    
    $yourValue = new YourValue;
    $yourValue->setValue('value1');
    //More code
    $yourValue->setValue(' - value2');
    //More code
    echo $yourValue->getValue();
    

    然而,尽管如此优雅、干净、易于管理和可重复使用,但对于您想要的东西来说,它也完全是矫枉过正。除非您的价值类似于(例如)一个重要的增量金额,例如某人的购物车总数(或其他)。

    希望有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多