Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
concat-php字符串;使用。运算符或双引号_Php_String - Fatal编程技术网

concat-php字符串;使用。运算符或双引号

concat-php字符串;使用。运算符或双引号,php,string,Php,String,编辑-我的问题不仅仅局限于性能,我还想知道每种性能的缺陷,以及是否存在一种情况,即一种应优于另一种 在PHP中使用哪种方法来压缩字符串更好 选项A:使用。运算符来连接字符串 $string1 = "hello "; $string2 = $string1 . "world !"; 选项B:使用双引号 $string1 = "hello "; $string2 = "$string1 world !"; 我意识到两者实际上会做同样的事情,在我的个人发展中,我更喜欢使用。操作人员 我的问题之所以

编辑-我的问题不仅仅局限于性能,我还想知道每种性能的缺陷,以及是否存在一种情况,即一种应优于另一种

在PHP中使用哪种方法来压缩字符串更好

选项A:使用。运算符来连接字符串

$string1 = "hello ";
$string2 = $string1 . "world !";
选项B:使用双引号

$string1 = "hello ";
$string2 = "$string1 world !";
我意识到两者实际上会做同样的事情,在我的个人发展中,我更喜欢使用。操作人员 我的问题之所以出现,是因为我读到了。运算符强制php与每个新字符串重新连接,因此在示例中:

$string1 = "hello ";
$string2 = "world";
$string3 = $string1.$string2." !";
实际上运行速度比

$stirng1 = "hello";
$string2 = "world";
$string3 = "$string1 $string2 !";

参考文献:

如果需要同时把大量的字符串放在一起,请考虑.< /P>


对于数量不多的字符串,您使用的方法没有明显的差异。

串联几乎总是比插值快,但差异很少显著到值得注意的程度。也就是说,我更喜欢连接,因为当(例如)您想要将字符串更改为方法或函数调用时,它允许更容易的编辑。即,从:

$s1 = 'this ' . $thing . ' with a thing';
致:


编辑:当我说“连接几乎总是比插值快”的时候,我的意思是,我实际上已经对许多不同形式的连接进行了基准测试,我不仅仅是猜测,或者重复别人的帖子。这很容易做到,试试看。

我认为在你开始担心它之前,你需要看看它是否值得考虑。我确实考虑过,写了下面的小脚本,运行它来看看基准测试是什么样子的

对于每个循环,我通过了100000次。现在我没有在任何地方打印我的字符串,所以如果PHP优化器因此而拿走了我所有的工作,那么我道歉。然而,看看这些结果,你会发现每种方法的差异约为0.00001秒

在为可读性以外的任何内容进行优化之前,请使用探查器并查看热点的位置。如果运行数千万次串联,则可能会有一个参数。但是对于1000,您仍然在谈论0.01秒的差异。我相信,只要优化SQL查询等,您就可以节省超过0.01秒的时间

我的证据如下

以下是我的跑步记录:

<?php
for($l = 0; $l < 5; $l++)
  {
    echo "Pass " .$l. ": \n";
    $starta = microtime(1);
    for( $i = 0; $i < 100000; $i++)
      {
    $a = md5(rand());
    $b = md5(rand());
    $c = "$a $b".' Hello';
      }
    $enda = microtime(1);

    $startb = microtime(1);
    for( $i = 0; $i < 100000; $i++)
      {
    $a = md5(rand());
    $b = md5(rand());
    $c = $a . ' ' . $b . ' Hello';
      }
    $endb = microtime(1);


    echo "\tFirst method: " . ($enda - $starta) . "\n";
    echo "\tSecond method: " . ($endb - $startb) . "\n";
  }

您的服务器是否遇到任何性能问题?使用最清晰的内容,为您之后的下一位程序员阅读!我可以想象连接会更快,因为后者需要解析文本并查找$expression或使用eval(),这可能要慢得多。实际上,如果您阅读引用,作者说concat更快。“我运行了下面的脚本,发现使用“$var”比使用“$var”慢得多。$var”双引号版本不会在结果中添加额外的空间吗?(如果生成HTML,这可能不可见。)@Kerrek SB,我有,并且我在测试服务器上看到了与预期相同的结果。字符串连接在所有情况下都比数组方法快。这可能是环境造成的吗?我已经运行了这里发布的测试,我看到插值运行得稍微快一些。当然,它也可能会根据您的操作系统、PHP版本、字符串长度、正在编译的字符串数量、湿度和月相而发生变化。这就是为什么你永远不应该问别人什么更快,总是用你的代码在你的硬件上测量它。我更新了我的帖子,性能是一个问题。请阅读上面的编辑。而且,尽管正确,你也不必如此苛刻。然而,一个简单的“是”。。就足够了。没有严厉的意思,只是想强调你应该养成自己做性能测试的习惯,因为有太多不同的事情会影响结果;我已经运行了一个测试,我的结果与您的结果冲突。这就是为什么我问环境会如何影响这样一个基本的操作。这是一个很好的例子。我也在寻找关于这两种方法的信息,以及在何时/何地应该使用哪种方法。老实说,我将编写对其他开发人员来说最明显的代码。我个人的偏好是串联(
$a.'.'.$b
)和插值(
“$a$b”
)。好吧,我同意这一点。但是还没有人回答我的问题。是否有一个条件,其中一个应该比另一个使用,或者这只是一个偏好的问题?为此,我想说是的,有一个条件,条件是:使用任何更可读的东西。如果这与速度不符,在极端情况下,则优化速度。请记住,您或其他人必须回来维护代码。我知道这是一个尖刻的回应,但从这个意义上说,要优化的东西确实比速度更重要。优化清洁度和未来维护。;)
$s1 = 'this ' . blarg($thing) . ' with a thing';
<?php
for($l = 0; $l < 5; $l++)
  {
    echo "Pass " .$l. ": \n";
    $starta = microtime(1);
    for( $i = 0; $i < 100000; $i++)
      {
    $a = md5(rand());
    $b = md5(rand());
    $c = "$a $b".' Hello';
      }
    $enda = microtime(1);

    $startb = microtime(1);
    for( $i = 0; $i < 100000; $i++)
      {
    $a = md5(rand());
    $b = md5(rand());
    $c = $a . ' ' . $b . ' Hello';
      }
    $endb = microtime(1);


    echo "\tFirst method: " . ($enda - $starta) . "\n";
    echo "\tSecond method: " . ($endb - $startb) . "\n";
  }
Pass 0: 
    First method: 1.3060460090637
    Second method: 1.3552670478821
Pass 1: 
    First method: 1.2648279666901
    Second method: 1.2579910755157
Pass 2: 
    First method: 1.2534148693085
    Second method: 1.2467019557953
Pass 3: 
    First method: 1.2516458034515
    Second method: 1.2479140758514
Pass 4: 
    First method: 1.2541329860687
    Second method: 1.2839770317078