Rubyの虜に見PHP subexpressionsに文字列
-
22-08-2019 - |
質問
文脈
- PHP5.3.x
概要
というコードレビュー助者の両方を使用php、rubyを日常的に、楽しい挑戦が文字列の置換がphpと比較します。
質問
想定color="オレンジ";
Ruby
puts("My favorite color is #{color.downcase() + 'ish'} -- at least for now.");
PHP:
print("My favorite color is {strtolower( $color ) + 'ish'} -- at least for now.");
挑戦: 誰でもできるので指をわかりやすく伝えるため、PHP版のように振る舞いルビー?
とを条件と
この課題を対象として楽しく運動の制約のみを使用し直しはクリアしました。ことを意図したものではない深刻なPHP。深刻なPHP事業、デベロッパーというアドオンの図書館など 小枝.
解決
あなたはそのような文字列内のプレーンな関数を呼び出すことはできませんが、奇妙なことをやっにパーサをなだめすかすことができます:
<?php
print "{$a->b()}"; // Works
//Parse error: syntax error, unexpected '(' in Command line code on line 1
print "${time()}";
print "${$a=time()} $a"; // Also works: prints "1234380996"
?>
限り、それは開始時に有効な変数を見ているように、それは先に行くと、文句なしに文全体を補間します。
思っていた人のために、はい、これはあまりにも動作します...
<?php
print "${$a or print shell_exec('ls')}";
?>
他のヒント
あなたが近くにいる、あなたは、文字列内の変数を埋め込むが、関数呼び出しすることはできません。
Iは、同じ名前のC関数の周りに薄いラッパーであり、そのためprintf()
(及びsprintf()
)を使用し
printf('My favorite color is %sish -- at least for now.', strtolower( $color ));
そこにその%s
を参照してください?それはあなたが2番目の引数として渡している文字列データ型のプレースホルダです。
sprintf()
は同じように動作しますが、それはそれをprint'ingのではなく、フォーマットされた文字列を返します。
唯一の他のオプションがあります:
A。最初の関数を呼び出して実行し、変数に最終結果を割り当てる
$color = strtolower( $color );
print("My favorite color is {$color}ish -- at least for now.");
B。 IMO少し醜い連結を、使用します:
print('My favorite color is ' . strtolower( $color ) . 'ish -- at least for now.');
あなたは、単一引用符(別名ティック)、および二重引用符の私の使用を気づいているかもしれません。
あなたは上記の「A」に見るように、PHPでは、二重引用符内のリテラルは、変数のために解析されます。
単一引用符内のリテラルは解析されません。このため、彼らは速いです。解析される変数があるときあなたは、原則として、唯一のリテラルの周りに二重引用符を使用する必要があります。
'My favorite color is ' . strtolower( $color ) . 'ish-- at least for now.'
私はPHPが文字列に補間完全な表現をサポートしていと思ういけません。私も任意のPHPをしたので、しばらくしてます。
これは何でもありの場合は....
class ColorIsh {
var $color;
function __constructor($color) { $this->color = $color; }
function __get($prop) {
if ($prop == 'ish') {
// code here fixing suffix if needed
return strtolower($this->color) . 'ish';
}
return '';
}
function __set($prop) {}
}
$color = new ColorIsh("orange");
$str = "My favorite color is $color->ish -- at least for now.";
とHyper高度なバージョン
class ColorIsh {
private $color;
function __constructor($color) {$this->color = $color; }
function __get($prop) {
if ($prop == 'color')
return $this->color;
if ($prop == 'ish')
return isset($this->ish) ? $this->ish : $this->color . 'ish';
return false;
}
function __set($prop, $value) {
if ($prop == 'color') { $this->color = $value; unset($this->ish); }
if ($prop == 'ish') { $this->ish = $value; }
}
}
$color = new ColorIsh('orange');
$color->ish = 'orangish';
print "The color is kinda $color->ish";
$color->color = 'green';
print "The color is kinda $color->ish";
output:
The color is kinda orangish.
The color is kinda greenish.
それはそれはかなりありませんが、あなたは無名関数を使用することができます。
$e = function($val) { return $val; };
$foo = 'foo';
echo "Uppercase foo = {$e(strtoupper($foo))}";
それはすべての時間を再作成する必要はありませんので、私のプロジェクトは、通常、上記の無名関数を返すヘルパー関数を持っています。
function returner() {
static $returner;
if (!$returner) {
$returner = function($val) {
return $val;
};
}
return $returner;
}
$e = returner();
不可。しかし、あなたが本当に主張するならば、あなたは常に流れるようなインターフェイスでStringクラスを作成することができます...しかし、それはクレイジーだ:)