Ruby上瘾者在字符串中寻找PHP子表达式

dre*_*mac 2 php ruby comparison string-interpolation

上下文

  • PHP 5.3.x.

概观

在与常规使用php和ruby的同事进行代码审查之后,与ruby相比,php中的字符串插值有了一个有趣的挑战.

假设color ="orange";

红宝石:

puts("My favorite color is #{color.downcase() + 'ish'} -- at least for now.");
Run Code Online (Sandbox Code Playgroud)

PHP:

print("My favorite color is {strtolower( $color ) + 'ish'} -- at least for now.");
Run Code Online (Sandbox Code Playgroud)

挑战:任何人都可以指定一种方法来使PHP版本像Ruby一样吗?

警告

这个挑战旨在作为一种有趣的练习,仅限于使用直接PHP.这不适用于严肃的PHP项目.对于严肃的PHP项目,开发人员需要考虑插件库,例如TWIG.

Sha*_*e H 8

你很接近,你可以在字符串中嵌入变量,但不能在函数调用中嵌入变量.

我使用printf()(和sprintf()),这是一个围绕同名C函数的薄包装:

printf('My favorite color is %sish -- at least for now.', strtolower( $color ));
Run Code Online (Sandbox Code Playgroud)

看到%s那里?这是您作为第二个参数传入的字符串数据类型的占位符.

sprintf() 以相同的方式工作,但它返回格式化的字符串而不是打印它.

唯一的其他选择是:

A.首先执行函数调用并将最终结果分配给变量:

$color = strtolower( $color );
print("My favorite color is {$color}ish -- at least for now.");
Run Code Online (Sandbox Code Playgroud)

B.使用连接,这是一个有点丑陋的IMO:

print('My favorite color is ' . strtolower( $color ) . 'ish -- at least for now.');
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到我使用单引号(也称为刻度)和双引号.

在PHP中,双引号内的文字被解析为变量,如上面的"A"所示.

单引号内的文字不会被解析.因此,它们更快.作为一项规则,当有一个要解析的变量时,你应该只在文字周围使用双引号.