왜 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진수), 소수점 수, 패딩 등을 지정합니다.Google for printf에서 많은 예를 찾을 수 있습니다.printf에 대한 위키피디아 기사를 보시면 시작할 수 있을 겁니다.
sprintf에는 많은 사용 사례가 있지만, 제가 사용하는 방법 중 하나는 'Hello, My Name is %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
이는 훨씬 더 타당하고 다른 언어로 번역하는 것이 훨씬 더 유연합니다.
제가 발견한 가장 좋은 이유는 언어 파일에 모든 언어 문자열을 넣을 수 있기 때문입니다.필요에 따라 번역하고 주문할 수 있습니다.그러나 문자열이 어떤 형식으로 되어 있어도 사용자 이름을 표시하고 싶어한다는 것을 알 수 있습니다.
예를 들어, 사이트의 페이지 상단에 "Welcome back [User](어서 오세요)"라고 표시됩니다.프로그래머는 UI 사용자가 어떻게 쓸지 모르거나 신경 쓰지 않습니다.메시지 어딘가에 사용자 이름이 표시된다는 것만 알고 있습니다.
따라서 메시지가 실제로 무엇인지 걱정하지 않고 코드에 메시지를 삽입할 수 있습니다.
Lang 파일(EN_)(미국):
...
$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."
삽입된 변수는 순서만 중요할 뿐 처음부터 끝까지 여러 언어를 사용할 필요는 없습니다.
물론 약간의 퍼포먼스 향상에도 불구하고 이 대체를 수행하기 위해 독자적인 함수를 작성할 수 있지만, (언어 문자열을 읽는 클래스가 있는 경우)그냥 하는 것이 훨씬 빠릅니다.
/**
* 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 삽입 공격을 방지하기 위해 이 방법을 사용하기 전에 로 모든 입력 변수를 삭제해야 합니다.안전하지 않은 입력을 해석하면 사이트와 서버가 해킹당합니다(물론 코드에 의해 완전히 구축되어 안전성이 보장되는 변수는 제외합니다).
sprintf()를 사용하면 스트링을 포맷하는 것이 훨씬 깨끗하고 안전합니다.
입력 때 치 않은 돌발 된다는 점 등).%s
] 또는 숫자 [[ ]를 합니다.%d
]) 이것은 SQL 주입의 위험성에 도움이 될 수 있지만 문자열이 따옴표로 구성되어 있는 경우 이를 방지하지는 않습니다.
플로트 이 되며, 정밀도를 으로 지정할 수 를 들어, 숫자 정밀도, 숫자 정밀도 사용할 수 있습니다.%.2f
을 사용할 가 없습니다를 사용하면 변환 기능을 사용할 필요가 없습니다.
다른 은 대부분의 입니다.sprintf()
그래서 익숙해지면 새로운 언어를 배우는 것보다 훨씬 더 사용하기 쉽다(예를 들어 줄을 연결하거나 플로트를 변환하는 방법).
요약하면, 보다 명확하고 읽기 쉬운 코드를 얻기 위해 사용하는 것이 좋습니다.
예를 들어, 다음의 실제 예를 참조해 주세요.
$insert .= "('".$tr[0]."','".$tr[0]."','".$tr[0]."','".$tr[0]."'),";
간단한 를 할 수 .'1','2','3','4'
:
print "foo: '" . $a . "','" . $b . "'; bar: '" . $c . "','" . $d . "'" . "\n";
포맷된 문자열로 인쇄:
printf("foo: '%d','%d'; bar: '%d','%d'\n", $a, $b, $c, $d);
서 ''는printf()
sprintf()
단, 포맷된 문자열을 (변수로) 반환하지 않고 출력합니다.
어떤 것이 더 읽기 쉽습니까?
저도 최근에 사용하지 않는 한 같은 것을 생각하고 있었습니다.사용자 입력에 따라 문서를 생성할 때 유용합니다.
"<p>Some big paragraph ".$a["name"]." again have tot ake care of space and stuff .". $a["age"]. "also would be hard to keep track of punctuations and stuff in a really ".$a["token"]. paragarapoh.";
라고 쉽게 쓸 수 있다.
sprintf("Some big paragraph %s. Again have to take care of space and stuff.%s also wouldnt be hard to keep track of punctuations and stuff in a really %s paragraph",$a,$b,$c);
이것은, 다음과 같습니다.
"<p>Some big paragraph ".$a["name"]." again have to take care of space and stuff .". $a["age"]. "also would be hard to keep track of punctuations and stuff in a really ".$a["token"]. paragraph.";
다음과 같이 기재할 수도 있습니다.
"<p>Some big paragraph {$a['name']} again have to take care of space and stuff .{$a['age']} also would be hard to keep track of punctuations and stuff in a really {$a['token']} paragraph.";
내 생각에 이것은 읽기 더 쉽지만 현지화 또는 포맷을 위한 용도는 알 수 있다.
출력 형식을 보다 정확하게 제어해야 하는 경우가 있습니다.예를 들어, 특정 값이 그 길이에 따라 특정 공간을 전면에 채워 넣거나 특정 정확한 형식으로 숫자가 출력되도록 하는 것은 까다로울 수 있습니다.
PHP 매뉴얼에는 많은 예가 있습니다.
또, 「작성하기 쉽다」의 예를 들면,에코가 쓰기 쉬운 반면, sprintf는 특히 변수가 많은 경우 읽기 쉽습니다.
sprintf 또는 printf를 사용하는 또 다른 이유는 사용자가 어떤 값의 출력 형식을 정의할 수 있도록 하고 싶기 때문일 수 있습니다. 즉, 사용자가 sprintf 호환 출력 형식을 안전하게 정의할 수 있도록 허용할 수 있습니다.
이 는 사실 이 있어요. sprintf
되지만 " " "는 반환됩니다.echo
않는다 - 할수 - - - - -echo
도 반환하지 반면, 이 값은 반환되지 않습니다.sprintf
그냥 돌려줘.
C/C++ 를 사용해 본 적이 있는 경우는, sprintf 함수에 익숙합니다.
두 번째 라인이 덜 효율적일 가능성이 높습니다.echo는 출력 명령어로 설계되어 있으며 sprintf는 문자열 토큰 치환을 실행하도록 설계되어 있습니다.저는 PHP를 좋아하는 사람은 아니지만 에코에 관련된 오브젝트가 더 있을 것 같습니다.Java와 같이 동작하면 목록에 추가될 때마다 새로운 문자열이 생성되므로 4개의 문자열이 생성됩니다.
보통 sprintf를 사용하여 사용자 입력에서 가져온 ID가 다음과 같은 정수인지 확인합니다.
// is better use prepared statements, but this is practical sometimes
$query = sprintf("SELECT * from articles where id = %d;",$_GET['article_id']);
또한 기본 템플릿(html 메일 또는 기타 용도로)을 수행하기 위해 사용되므로 템플릿을 여러 곳에서 재사용할 수 있습니다.
$mail_body = "Hello %s, ...";
$oneMail = sprintf($mail_body, "Victor");
$anotherMail = sprintf($mail_body, "Juan");
숫자 형식을 다른 표현(8진수, 소수점 제어 등)으로 지정하는 것도 매우 유용합니다.
sprintf 는 숫자를 사용하는 문자열을 포맷할 때 특히 유용합니다.예를들면,
$oranges = -2.34;
echo sprintf("There are %d oranges in the basket", $oranges);
Output: There are -2 oranges in the basket
오렌지는 정수(-2)로 포맷되지만 부호 없는 값에 %u를 사용하면 양수로 감깁니다.이 동작을 피하기 위해 절대 함수 abs()를 사용하여 다음과 같이 숫자를 0으로 반올림합니다.
$oranges = -5.67;
echo sprintf("There are %d oranges in the basket", abs($oranges));
Output: There are 5 oranges in the basket
최종 결과는 높은 가독성, 논리적 구성, 명확한 형식 및 필요에 따라 변수를 추가할 수 있는 유연성을 갖춘 문장입니다.변수의 수가 이러한 변수를 조작하는 함수와 함께 증가하면 편익이 더욱 뚜렷해집니다.마지막 예로서:
$oranges = -3.14;
$apples = 1.5;
echo sprintf("There are %d oranges and %d apples", abs($oranges), abs($apples));
Output: There are 3 oranges and 4 apples
sprintf 문장의 왼쪽은 문자열과 기대치의 유형을 명확하게 표현하고 오른쪽은 사용된 변수와 그 조작 방법을 명확하게 표현한다.
②번.sprintf
에는 다음과 같은 많은 기능이 있습니다.
달까지만 해도 를 시:초. 예를 들어: 초: 초: 분: 초 형식으로 변환해야 했습니다.$t = 494050 //seconds
137 h 14 m 10 s
함수를 해 냈습니다.springf()
동안만 돼요$t
★★★★★★★★★★★★★★★★★」echo sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60);
에게 주다137 h 14 m 10 s
sprintf() 함수는 사용법을 알고 있다면 매우 유용합니다.
가끔 이런 것도 있는데 좀 더 쉽게 읽을 수 있을 것 같아요.
$fileName = sprintf('thumb_%s.%s',
$fileId,
$fileInfo['extension']);
define('TEXT_MESSAGE', 'The variable "%s" is in the middle!');
sprintf(TEXT_MESSAGE, "Var1");
sprintf(TEXT_MESSAGE, "Var2");
sprintf(TEXT_MESSAGE, "Var3");
이 인수는 템플릿을 사용하는 인수와 동일합니다.Textleev를 실제 변수 값과 분리해야 합니다.우리가 언급한 스프린트의 부가적인 힘 외에도 그것은 단지 스타일일 뿐이다.
sprintf를 사용할 때 가장 좋은 사용 사례는 패딩된 형식의 숫자를 출력하는 것입니다.또한 문자열에서 다른 유형을 혼합할 때도 마찬가지입니다.많은 경우 쉽게 읽을 수 있으며, 동일한 변수(특히 숫자)의 다양한 표현을 쉽게 인쇄할 수 있습니다.
일반 연결보다 sprintf() 함수를 사용하면 연결할 변수에 다른 유형의 형식을 적용할 수 있다는 장점이 있습니다.
당신의 경우,
$output = sprintf("Here is the result: %s for this date %s", $result, $date);
그리고.
$output = 'Here is the result: ' .$result. ' for this date ' .$date;
$result = 'passed'; date = '23rd';
일반 연결을 사용하면 다음과 같은 출력만 얻을 수 있습니다.
Here is the result: passed for this date 23rd
, ,를 sprintf()
다음과 같은 수정된 출력을 얻을 수 있습니다.
$output = sprintf('Here is the result: %.4s for this date %.2s',$result,$date);
echo $output;
출력:
Here is the result: pass for this date 23
sprintf()
꽤 비슷하다printf()
printf()
것은, 다음에sprintf()
그리고 심지어vsprintf()
이해하기 어렵지 않습니다.
one of the things that differs 다른 것 중 하나sprintf()
부에서printf()
출력/이 직접 인쇄/ μm에 직접 출력하는 변수를 선언해야 합니다.함수는 아무것도 직접 인쇄/표시하지 않기 때문에 함수 출력을 캡처하기 위해 변수를 선언해야 합니다.다음 코드 조각들을 참조하십시오.다음의 코드 스니펫을 참조해 주세요.
printf("Hello %s", "world"); // "Hello world"
sprintf("Hello %s", "world"); // does not display anything
echo sprintf("Hello %s", "world"); // "Hello world"
$a = sprintf("Hello %s", "world"); // does not display anything
echo $a;// "Hello world"
도움이 됐으면 좋겠다.
하나는 "출력"이고, 다른 하나는 "리턴"이며, 이것이 주요 차이점 중 하나입니다.
printf()
출력
sprintf()
반품
루프에서 sprintf를 사용할 때는 주의해야 합니다.
$a = 'Anton';
$b = 'Bert';
$c = 'Corni';
$d = 'Dora';
$e = 'Emiel';
$f = 'Falk';
$loops = 10000000;
$time = microtime(true);
for ($i = 0; $i < $loops; $i++)
{
$test = $a . $b . $c . $d . $e . $f;
}
$concatTime = microtime(true) - $time;
$time = microtime(true);
for ($i = 0; $i < $loops; $i++)
{
$test = "$a $b $c $d $e $f";
}
$concat2Time = microtime(true) - $time;
$time = microtime(true);
for ($i = 0; $i < $loops; $i++)
{
$test = sprintf('%s %s %s %s %s %s', $a, $b, $c, $d, $e, $f);
}
$sprintfTime = microtime(true) - $time;
echo 'Loops: ' . $loops . '<br>';
echo '\'$a . $b . $c . $d . $e . $f\'' . ' needs ' . $concatTime . 's<br>';
echo '"$a $b $c $d $e $f"' . ' needs ' . $concat2Time . 's<br>';
echo 'sprintf(\'%s %s %s %s %s %s\', $a, $b, $c, $d, $e, $f)' . ' needs ' . $sprintfTime . 's<br>';
그 결과 다음과 같은 시간이 발생합니다(PHP 7.2를 사용하는 로컬머신).
루프: 10000000
'$a. $b. $c. $d. $e. $f'에는 1.4507689476013s가 필요합니다.
"$a $b $c $d $e $f"에는 1.9958319664001s가 필요합니다.
sprintf(s) %s %s %s %s ', $a, $b, $c, $d, $e, $f)는 9.1201278381348s가 필요합니다.
사용자에게 보내는 메시지나 기타 "예쁜" 유형의 기능에 사용합니다.예를 들어 사용자 이름을 사용할지 알 수 있습니다.
$name = 'Some dynamic name';
그리고 그 상황에서 사용할 수 있는 메시지가 여러 개 있습니다.(즉, 다른 사용자를 차단하거나 팔로우하는 경우)
$messageBlock = 'You have blocked %s from accessing you.';
$messageFollow = 'Following %s is a great idea!';
사용자에게 어떤 작업을 수행하는 일반적인 함수를 만들고 이 문자열을 추가할 수 있습니다. 그리고 문장의 구조에 관계없이 매우 좋아 보일 것입니다.저는 항상 문장을 보기 좋게 하기 위해 끈을 붙이고 점 표기법과 끈을 닫고 다시 여는 것을 싫어합니다.저도 처음에는 팬이었지만, 여러 문자열을 조작할 필요가 있어 매번 변수 배치를 하드코드로 하고 싶지 않을 때 도움이 될 것 같습니다.
생각해 봐, 뭐가 더 좋아 보여?
return $messageOne === true ? $name.'. Please use the next example' : 'Hi '.$name.', how are you?'
또는
$message = $messageOne === true ? 'Option one %s'
: ($messageTwo === true ? 'Option Two %s maybe?' : '%s you can choose from tons of grammatical instances and not have to edit variable placement and strings');
return sprintf($message, $name);
물론 추가 단계이지만 조건부 체크가 많은 다른 기능을 수행하게 되면 인용문과 첨부가 기능적으로 코딩되는 데 방해가 되기 시작합니다.
언급URL : https://stackoverflow.com/questions/1386593/why-use-sprintf-function-in-php
'programing' 카테고리의 다른 글
Selenium Web 드라이버 및 Java.요소(x, y)는 점(x, y)에서 클릭할 수 없습니다.다른 요소는 클릭을 받습니다. (0) | 2023.01.25 |
---|---|
MariaDB - 청구서 번호 - 매년 0으로 돌아가기 (0) | 2023.01.25 |
PHP의 self::$bar와 static:$bar의 차이점은 무엇입니까? (0) | 2023.01.25 |
python->SQ에서 mysql(MariaDB)에 대한 접속이 실패함cmd에 성공하는 동안 LALchemy (0) | 2023.01.25 |
스핑크스의 자동화가 불충분하다 (0) | 2023.01.15 |