[php] PHP에서 sprintf 함수를 사용하는 이유는 무엇입니까?

PHP 함수 sprintf ()에 대해 더 배우려고하지만 php.net이 여전히 혼란스러워서 도움이되지 않았습니다. 왜 그것을 사용하고 싶습니까?

아래의 예를 살펴보십시오.

이것을 사용하는 이유 :

$output = sprintf("Here is the result: %s for this date %s", $result, $date);

이것이 동일하고 IMO 작성이 더 쉬운 경우 :

$output = 'Here is the result: ' .$result. ' for this date ' .$date;

여기에 뭔가 빠졌습니까?



답변

sprintf 는 원본 printf의 모든 서식 기능을 갖추고 있으므로 문자열에 변수 값을 삽입하는 것 이상의 작업을 수행 할 수 있습니다.

예를 들어 숫자 형식 (16 진수, 10 진수, 8 진수), 소수, 패딩 등을 지정하십시오. printf 용 Google을 사용하면 많은 예를 찾을 수 있습니다. printfwikipedia 기사 를 시작해야합니다.


답변

sprintf에 대한 많은 사용 사례가 있지만 내가 사용하는 한 가지 방법은 다음과 같은 문자열을 저장하는 것입니다. ‘안녕하세요, 내 이름은 % s’입니다. 데이터베이스에 또는 PHP 클래스의 상수입니다. 그 문자열을 사용하고 싶을 때 간단히 이렇게 할 수 있습니다.

$name = 'Josh';
// $stringFromDB = 'Hello, My Name is %s';
$greeting = sprintf($stringFromDB, $name);
// $greetting = 'Hello, My Name is Josh'

본질적으로 코드에서 약간의 분리가 가능합니다. 내 코드의 여러 위치에서 ‘Hello, My Name is % s’를 사용하면 한 곳에서 ‘% s is my name'(으)로 변경할 수 있으며 각 인스턴스로 이동하거나 이동하지 않고도 다른 곳에서 자동으로 업데이트됩니다. 연결.


답변

다른 용도 sprintfsprintf형식화 된 문자열에 나타나는 순서대로 배열 될 필요가없는 인수로 현지화 된 응용 프로그램에서 됩니다.

예:

$color = 'blue';
$item = 'pen';

sprintf('I have a %s %s', $color, $item);

그러나 프랑스어와 같은 언어는 단어를 다르게 주문합니다.

$color = 'bleu';
$item = 'stylo';

sprintf('J\'ai un %2$s %1$s', $color, $item);

(예, 프랑스어가 짜증납니다 : 학교에서 독일어를 배웠습니다!)

실제로는 gettext 를 사용하여 지역화 된 문자열을 저장하지만 아이디어를 얻습니다.



답변

번역하기가 더 쉽습니다.

echo _('Here is the result: ') . $result . _(' for this date ') . $date;

번역 (gettext) 문자열은 다음과 같습니다.

  • 결과는 다음과 같습니다.
  • 이 날짜에

다른 언어로 번역 할 때 불가능하거나 매우 이상한 문장이 될 수 있습니다.

지금 가지고 있다면

echo sprintf(_("Here is the result: %s for this date %s"), $result, $date);

번역 (gettext) 문자열은 다음과 같습니다.

  • 결과는 다음과 같습니다.이 날짜의 % s % s

훨씬 더 의미가 있고 다른 언어로 번역하는 것이 훨씬 더 유연합니다.


답변

내가 찾은 가장 좋은 이유는 언어 파일에 모든 언어 문자열을 배치하여 사람들이 필요에 따라 번역하고 순서를 지정할 수 있었기 때문에 문자열의 형식에 관계없이 표시하려는 것입니다. 사용자 이름

예를 들어 사이트 상단에 “[[User]] 님을 환영합니다”라고 표시됩니다. 프로그래머 는 UI 사용자가 어떻게 작성하는지 알지 못 하거나 신경 쓰지 않습니다 . 사용자 이름이 메시지의 어딘가에 표시 될 것입니다.

따라서 메시지가 실제로 무엇인지 걱정하지 않고 코드에 메시지를 포함시킬 수 있습니다.

랭 파일 (EN_US) :

...
$lang['welcome_message'] = 'Welcome back %s';
...

그런 다음 실제 PHP 코드에서이를 사용하여 모든 언어로 모든 유형의 메시지를 지원할 수 있습니다.

sprintf($lang['welcome_message'], $user->name())


답변

왜 그것을 사용하고 싶습니까?

언어 문자열에 (외부) 소스를 사용할 때 매우 유용합니다. 주어진 다국어 문자열에 고정 된 수의 변수가 필요한 경우 올바른 순서 만 알고 있으면됩니다.

en.txt

not_found    = "%s could not be found."
bad_argument = "Bad arguments for function %s."
bad_arg_no   = "Bad argument %d for function %s."

hu.txt

not_found    = "A keresett eljárás (%s) nem található."
bad_argument = "Érvénytelen paraméterek a(z) %s eljárás hívásakor."
bad_arg_no   = "Érvénytelen %d. paraméter a(z) %s eljárás hívásakor."

삽입 된 변수는 여러 언어의 시작 또는 끝에있을 필요조차 없으며 순서 만 중요합니다.

물론 약간의 성능 향상에도 불구 하고이 대체를 수행하는 자체 함수를 작성할 수는 있지만 언어 문자열을 읽을 수있는 클래스가있는 경우Language 훨씬 빠릅니다 .

/**
 * throws exception with message($name = "ExampleMethod"):
 *  - using en.txt: ExampleMethod could not be found.
 *  - using hu.txt: A keresett eljárás (ExampleMethod) nem található.
 */
throw new Exception(sprintf(Language::Get('not_found'), $name));

/**
 * throws exception with message ($param_index = 3, $name = "ExampleMethod"):
 *  - using en.txt: Bad argument 3 for function ExampleMethod.
 *  - using hu.txt: Érvénytelen 3. paraméter a(z) ExampleMethod eljárás hívásakor.
 */
throw new Exception(sprintf(Language::Get('bad_arg_no'), $param_index, $name));

또한의 모든 기능과 함께 제공 printf되므로 다음과 같이 다양한 유형의 변수를 형식화하기위한 단일 라이너입니다.


답변

언급했듯이 입력 데이터의 형식을 지정할 수 있습니다. 예를 들어, 2dp, 4 자리 숫자 등을 강제하는 등 MySQL 쿼리 문자열을 작성하는 데 매우 유용합니다.

또 다른 장점은 거의 매개 변수를 입력하는 것과 같이 문자열 레이아웃을 공급되는 데이터와 문자열 레이아웃을 분리 할 수 ​​있다는 것입니다. 예를 들어 MySQL 쿼리의 경우 :

// For security, you MUST sanitise ALL user input first, eg:
$username = mysql_real_escape_string($_POST['username']); // etc.
// Now creating the query:
$query = sprintf("INSERT INTO `Users` SET `user`='%s',`password`='%s',`realname`='%s';", $username, $passwd_hash, $realname);

이 방법은 물론 HTML로 출력을 인쇄 할 때와 같은 다른 용도로 사용됩니다.

편집 : 보안상의 이유로 위의 기술을 사용할 때 MySQL 삽입 공격을 방지 하기 위해이 방법을 사용하기 전에 모든 입력 변수를 위생 처리해야합니다mysql_real_escape_string() . 비 염소 입력을 구문 분석하면 사이트와 서버가 해킹 됩니다. (물론 코드에 의해 완전히 구성되고 안전하다는 보장은 제외합니다.)