14

printf()これは本当に難しい質問のように思えるかもしれませんが、PHPに関数が存在する理由は何ですか?

使用echoするとまったく同じ結果が得られるように思えますが、1行に複数の変数が出力されている場合でも混乱しないという追加のボーナスがあります(実際、%1$s単に%sではなく使用できますが、それでも可能です)いくつかの変数がすべて宣言されているメッセイを取得します)。

文字列を出力する前に変数を修正しなくても、変数の型を定義できることは知っていますが、関数を作成するのに十分ではないように思えます。

私は間違っているかもしれませんし、明らかな何かが欠けているかもしれませんが、誰かがそれが存在する理由を理解するのを手伝ってくれるなら(私が本当にそれを使うべきかどうかを知るために!)私はそれを認めます。ありがとう。

4

7 に答える 7

11

echo言語構成でprintfあり、関数です。echoつまり、と同じように使用することはできませんprintf

個人的な趣味ではありません

両方の機能のマニュアルページをご覧ください。

このトピックはそこで説明されています。たとえば、echo変数関数を使用して呼び出すことはできません。さらに、入力を取得して管理する方法も異なります。提供されているパラメータFORMATTINGが必要ない場合は、使用する必要がありprintfますecho(少し高速です)。

私は再びいくつかのキーワードを主張します:フォーマット機能。の使用はprintf、文字列を連結したり、プレースホルダーから文字列を作成したりすることではなく、カスタムフォーマット(おそらく構成、ユーザー入力など)を使用して行うことです。

私が何を意味するかを説明するためにいくつかのコードを書きます(私が投稿したリンクの元のソース)。

このコードは無効でechoあり、関数ではないため、出力された値を返しません(printまたはsprintfを使用できますがprint、文字列の連結は提供されません)。

($some_var) ? echo 'true' : echo 'false';

次のコードは、フォーマットされた文字列を出力します。この場合、フォーマットはリテラル変数から取得されますが、(たとえば)GETリクエストなどから取得される場合があります。echo構成から取得したフォーマット文字列を使用して書き直すことはできますか?

%format = "%'.-15.15s%'.6.6s\n";
printf($format, $heading1, $value1);
于 2012-05-15T11:08:36.963 に答える
9

printf()はCのprintf()関数の移植版であるため、Cコードの記述のバックグラウンドを持っている人は構文に精通しており、それを好むでしょう。ただし、PHPを使い始めるほとんどの人は、PHPをかなり混乱させます。

比較のために:

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
        mysql_real_escape_string($user),
        mysql_real_escape_string($password));

(私はsprintf()を使用しました。これはprintfと同じですが、実際には文字列を出力せず、単に文字列を返します)


$query = "SELECT * FROM users WHERE user='" . mysql_real_escape_string($user) . "' AND password='" . mysql_real_escape_string($password) . "'";

それは好みの問題です!

于 2012-05-15T11:07:27.713 に答える
4

これは、静的な文字列とフォーマット、およびデータを分離することです。

この分離は、私が知っているすべてのプログラミング言語で推奨されています。理由は次のとおりです。

  • プログラマーの意図はより明確で強制されています

    意図は明確です:これを読むと、各フィールドでどのタイプが待機しているかがわかります。

       printf("a: %.2f, b: %s, c: %d", $a, $b, $c)
    

    意図が強制されます:愚かなタイプのエラーは制限されます(セキュリティ上の懸念に関して)。

  • より安全です

    予期しないメタ文字列のばかげた挿入を制限するため:

       $avg = 3.1415;
       // $avg = '3</td><a href="http://www.badsite.com">pawned!</a>';
       printf("average: %.2f", $avg);
    

    SQLではもっと悪いです...

  • 通常ははるかに読みやすい

    あなたが作家の意図へのより多くの手がかりを持っているよりもAppart、文字列は明らかに1つのユニークな明確なブロックにあります。データは1つずつきれいにリストされます。"のようなものをあちこちで使いすぎない.でください。

  • それは非常に強力です

    私はあなたがなしで次のことをどのように行うのか知りたいですprintf

       printf("%.2f %5d", $v1, $v2);
    
  • それはプログラミングのある種の標準です

    他の多くのプログラミング言語(C、C ++、Java、Python、Bash ...)も、同様のprintf形式と文字列の処理方法を備えています。ですから、あなたがそれを知ることは良いことです、そしてすでに知っている人にとっては、それはより簡単です。その結果、このテーマに関するドキュメントやチュートリアルがいたるところにたくさんあり、そのためのウィキペディアのページ:print format string

  • 文字列はデータから自動的に分離できます

    そしてこれは、翻訳や構文修正に利用できることを意味します。

あなたは同様の懸念を見つけるでしょう:

  • mysql_queryプリペアドステートメントを優先してphp5.5で非推奨になり、現在は強制されているmysqlのプリペアドステートメント。
  • すべてのテンプレート言語:通常は異なる言語のテンプレートがあり、反対側にテンプレートをレンダリングするためのデータがあります。
  • より一般的なトピックはウィキペディアでカバーされています:文字列補間

最後の精度:

echo文字列を出力するだけです。そしてprintf、文字列補間を行い、文字列を出力します。

したがって、公平を期すために、ここでは、文字列の連結文字列の補間による文字列の構築を比較しています。で文字列を出力するのは問題ないのでecho。つまり、これはecho文字列の作成方法ではありません。次のように使用している場合でも、文字列補間を実行しています。echo

echo sprintf("avg: %.3f", $avg);

しかし、それでは、この最後の形式と次の形式の間にこれ以上の違いはありません。

printf("avg: %.3f", $avg);
于 2014-10-15T02:04:53.983 に答える
2

printfprintfPHPはCで作成され、Cでフォーマットされた文字列を出力するために伝統的に使用されて いるため、おそらく存在します。実際には、小数を含むさまざまなフォーマットの変数を特定の場所に出力できるため、printfさらに多くのことができます。echo

そうは言っても、PHP関数のいくつかの組み合わせでできることは何でもprintfできますが、背景によってはもっと理にかなっているかもしれません。

于 2012-05-15T11:08:42.937 に答える
1

私が行ったことを説明するだけで、明確な違いが得られます。私はPHP Proではないので、間違っている可能性があり、より良いまたはより簡単なアプローチがあります。また、私の例はあなたにとってあまり役に立たないかもしれません。良い。

翻訳したい各文字列を関数に渡すと、ソース文字列と現在の言語に基づいて、翻訳された文字列が返されます。このように翻訳すると、次のようになります。

「猫には%d匹の子猫がいます。」(英語)<=> "Katua%dkumeditu。" (バスク語)

事実、番号の前の部分はすべての言語で同じではないため、エコーの分割された文字列は翻訳できませんでした。したがって、「単一のエンティティ」として翻訳する必要があります。

于 2012-06-21T00:56:49.873 に答える
0

PHP言語に継承されたCからのレガシーです

関数http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

于 2012-05-15T11:07:44.903 に答える
0

printfは入力の受け取り方が異なります。フォーマット文字列を指定してから、必要なすべての入力を一覧表示できます(C / C ++の場合と同様)。

「echo」と「print」は文字列のみを取り、使いやすくなっています。

あなたの願い、あなたのスタイル:)

しないこと:

他の人がechoは言語構造であり、printfは実際の関数であると言っているように、printfで多くのことができます。

C / C ++のバックグラウンドを持つ人々は、%f、%d、%。2fなどの多くのフォーマット文字列を知っています。これらの浮動小数点精度フォーマットやその他のフォーマットがすぐに使えるので、このシナリオではprintfをエコーすることを好みます。彼らは、PHPの組み込みフォーマット関数よりもこれらを好みます。

于 2012-05-15T11:10:49.850 に答える