2

環境

  • PHP 5.3.x

概要

PHP と Ruby の両方を日常的に使用している同僚とコードレビューを行った後、Ruby と比較した PHP での文字列補間に関する楽しい課題が浮かび上がりました。

質問

color = "オレンジ" と仮定します。

ルビー:

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 バージョンを Ruby のように動作させる方法を指定できる人はいますか?

警告

この課題は、単純な PHP のみを使用するという制約がある楽しい演習として意図されています。これは、本格的な PHP プロジェクト向けではありません。本格的な PHP プロジェクトの場合、開発者はTWIGなどのアドオン ライブラリを検討する必要があります。

4

6 に答える 6

8

近いです。文字列に変数を埋め込むことはできますが、関数呼び出しはできません。

printf()そのために(and )を使用しますsprintf()。これは、同じ名前の C 関数の薄いラッパーです。

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

そこにある%sのが見えますか?これは、2 番目の引数として渡す文字列データ型のプレースホルダーです。

sprintf()同じように動作しますが、印刷する代わりにフォーマットされた文字列を返します。

他のオプションは次のとおりです。

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.');

一重引用符 (別名ティック) と二重引用符を使用していることに気付いたかもしれません。

PHP では、上記の「A」にあるように、二重引用符内のリテラルは変数として解析されます。

一重引用符内のリテラルは解析されません。このため、それらはより高速です。原則として、解析する変数がある場合にのみ、リテラルを二重引用符で囲む必要があります。

于 2009-02-11T19:27:03.943 に答える
4
'My favorite color is ' . strtolower( $color ) . 'ish-- at least for now.'

PHP が文字列に補間された完全な式をサポートしているとは思わない。PHPをやったのは久しぶりです。

于 2009-02-11T19:29:23.017 に答える
2

それほどきれいではありませんが、無名関数を使用できます。

$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();
于 2016-06-03T15:28:12.287 に答える
2

これなら何とかなる……。

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.";

そしてハイパーアドバンス版

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.
于 2009-02-11T19:53:30.697 に答える