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을 사용하면 많은 예를 찾을 수 있습니다. printf 의 wikipedia 기사 를 시작해야합니다.
답변
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'(으)로 변경할 수 있으며 각 인스턴스로 이동하거나 이동하지 않고도 다른 곳에서 자동으로 업데이트됩니다. 연결.
답변
다른 용도 sprintf
sprintf
형식화 된 문자열에 나타나는 순서대로 배열 될 필요가없는 인수로 현지화 된 응용 프로그램에서 됩니다.
예:
$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()
. 비 염소 입력을 구문 분석하면 사이트와 서버가 해킹 됩니다. (물론 코드에 의해 완전히 구성되고 안전하다는 보장은 제외합니다.)
