String

본문

String은 일련의 문자이며 문자는 1바이트와 같습니다. PHP는 기본적으로 256자 세트를 지원하며 유니코드 지원은 포함되지 않습니다. String 유형에 대한 세부 사항을 참조하십시오.

참고 : PHP 7.0.0부터 64비트 빌드에서 String 길이에 제한을 두지 않습니다. 32비트 빌드 및 이전 버전에서 String은 최대 2GB(최대 2147483647 바이트)입니다.

문법

String은 네 가지 방법으로 지정할 수 있습니다.

  • 작은 따옴표
  • 큰 따옴표
  • Heredoc 구문
  • Nowdoc 구문 (PHP 5.3.0부터)

작은 따옴표

String을 지정하는 가장 간단한 방법은 작은 따옴표(‘)로 묶는 것입니다.

작은 따옴표를 문자로 사용하려면 백슬래시(\) 문자를 앞에 입력합다. 백슬래시를 문자로 사용하려면 두 번(\\)입력합니다. 문자로 사용된 백슬래시는 이스케이프 문자로 사용되지 않습니다. 이는 \r 또는 \n 과 같이 익숙한 다른 이스케이프 시퀀스가 ​​특별한 의미를 가지지 않고 지정된 대로 출력됨을 의미합니다.

참고 : 큰 따옴표 및 Heredoc 구문과 달리 특수 문자의 변수 및 이스케이프 시퀀스는 작은 따옴표로 묶인 String에서 사용되지 않습니다.
<?php
echo '이것은 간단한 문장입니다.';

echo '작은 따옴표를 이용하여
줄바꿈을 표현할 수도 있습니다.
정상적으로 동작합니다.';

// 출력: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';

// 출력: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';

// 출력: You deleted C:\*.*?
echo 'You deleted C:\*.*?';

// 출력: 이스케이프 시퀸스는 사용되지 않습니다: \n 새로운 줄
echo '이스케이프 시퀸스는 사용되지 않습니다: \n 새로운 줄';

// 출력: 작은 따옴표는 전처리 없이 동작합니다: $expand $either
echo '작은 따옴표는 전처리 없이 동작합니다: $expand $either';
?>           

큰 따옴표

String이 큰 따옴표로 묶인 경우 PHP는 특수 문자에 대해 다음 이스케이프를 해석합니다.

SequenceMeaning
\n줄바꿈 (LF or 0x0A (10) in ASCII)
\r캐리지 리턴 (CR or 0x0D (13) in ASCII)
\t가로 탭 (HT or 0x09 (9) in ASCII)
\v세로 탭 (VT or 0x0B (11) in ASCII) (since PHP 5.2.5)
\e이스케이프 (ESC or 0x1B (27) in ASCII) (since PHP 5.4.4)
\f폼 피드 (FF or 0x0C (12) in ASCII) (since PHP 5.2.5)
\\백슬래시 문자 \
\$달러 문자 $
\”큰 따옴표 문자 “
\[0-7]{1,3}정규 표현식과 일치하는 문자는 8진수 표기법으로 해석됩니다.
\x[0-9A-Fa- f]{1,2}정규 표현식과 일치하는 문자는 16진수 표기법으로 해석됩니다.
\u{[0-9A-Fa-f]+}정규 표현식과 일치하는 문자는 유니코드 코드 포인트이며, 코드 포인트의 UTF-8 표현으로 String에 출력됩니다 (PHP 7.0.0에서 추가됨)

작은 따옴표로 묶인 String과 같이 위 표에 지정되지 않은 다른 문자를 이스케이프하면 백슬래시도 인쇄됩니다. PHP 5.1.1 이전에는 문자 앞의 백슬래시가 인쇄되지 않았습니다.

큰 따옴표로 묶인 String의 가장 중요한 특징으로 변수 이름을 지정하여 사용 가능합니다. 자세한 내용은 String 구문 분석을 참조하십시오.


Heredoc

String을 구분하는 세 번째 방법은 Heredoc 구문입니다. <<< 연산자 뒤에 식별자와 줄바꿈을 사용할 수 있습니다. String을 사용한 다음 동일한 식별자가 다시 인용 부호를 닫습니다.

닫는 식별자는 줄의 첫번째 열에서 시작해야 합니다. 또한 식별자는 PHP의 다른 레이블과 동일한 이름 지정 규칙을 따라야 합니다. 영숫자와 밑줄만 포함해야 하며 숫자로 시작할 수 없습니다.

경고 : 닫는 식별자가 있는 행은 세미콜론을 제외한 다른 문자를 포함해서는 안됩니다. 닫는 식별자를 사용하는 도중 들여쓰기할 수 없으며, 세미콜론의 앞뒤에 공백이나 탭이 없어야 합니다. 닫는 식별자 앞의 첫 문자는 항상 줄바꿈으로 시작해야 합니다. macOS를 포함한 UNIX 시스템에서는 \n 입니다.

닫는 식별자가 이 규칙에 위반되는 경우 PHP는 오류가 있는 행을 처리하지 않으며 계속해서 유효한 닫는 식별자를 찾습니다. 파일이 끝나기 전에 올바른 닫기 식별자를 찾지 못하면 마지막 행에 구문 분석 오류가 발생합니다.

Example #1 잘못된 방법

<?php
class foo {
    public $bar = <<<EOT
bar
    EOT;
}
// 식별자는 들여쓰기할 수 없습니다.
?>

Example #2 올바른 방법

<?php
class foo {
    public $bar = <<<EOT
bar
EOT;
}
?>

PHP 5.3부터 내부의 값에 변수를 포함하는 Heredoc은 클래스 속성을 초기화하는 데 사용할 수 없습니다.

Example #4 올바르지 않은 Heredoc 클래스 사용

<?php
class foo {
    public $bar = <<<EOT
    content $variable // {$variable} 변수가 있다면 오류가 발생합니다.
EOT;
}

$j = new foo();
echo $j->bar;
?> 

Heredoc은 큰 따옴표 없이 큰 따옴표로 묶인 문자열처럼 작동합니다. 따라서 Heredoc 안에서 따옴표를 이스케이프할 필요 없이 위에 나열된 이스케이프 코드를 계속 사용할 수 있습니다. 변수를 사용할 수 있으므로 Heredoc 내부에서 문자열과 복잡한 변수가 함께 사용되는 경우 주의를 기울여야 합니다.

Example #4 Heredoc 문자열 사용 예제

<?php
$str = <<<EOD
문자열의 예
여러 줄에 걸친
heredoc을 사용합니다. 
EOD;

/* 변수를 포함한 더욱 복잡한 예제 */
class foo
{
    var $foo;
    var $bar;

    function __construct()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = '김철수';

echo <<<EOT
저의 이름은 "$name" 입니다. 저는 $foo->foo 를 출력합니다.
이번에는 {$foo->bar[1]} 를 출력합니다.
이것은 문자 'A'를 출력합니다: \x41
EOT;
?>

위 예제는 다음과 같이 출력됩니다.

저의 이름은 "김철수" 입니다. 저는 Foo 를 출력합니다.
이번에는 Bar2 를 출력합니다.
이것은 문자 'A'를 출력합니다: A

Heredoc을 사용하여 데이터를 함수 인수에 전달할 수도 있습니다.

Example #5 Heredoc 인수 사용 예제

<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>

PHP 5.3.0부터 Heredoc을 사용하여 정적 변수와 클래스 속성 및 상수를 초기화할 수 있습니다.

Example #6 Heredoc을 이용한 초기화

<?php
// Static variables
function foo()
{
    static $bar = <<<LABEL
Nothing in here...
LABEL;
}

// Class properties/constants
class foo
{
    const BAR = <<<FOOBAR
Constant example
FOOBAR;

    public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>

PHP 5.3.0부터 Heredoc 식별자의 이름을 선택적으로 큰 따옴표로 묶을 수 있습니다.

Example #7 Heredoc 큰 따옴표 사용

<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>

Nowdoc

Nowdoc은 큰 따옴표로 묶인 문자열로 처리되는 Heredoc과 달리 작은 따옴표로 묶인 문자열로 처리됩니다. Nowdoc은 Heredoc과 유사하게 지정되지만 Nowdoc 내에서는 구문 분석이 수행되지 않습니다. 구문은 이스케이프 처리없이 PHP 코드 또는 기타 길이가 긴 문장을 포함하는 데 이상적입니다. 구문 분석용이 아닌 문장을 선언한다는 점에서 SGML <![CDATA []]>와 공통되는 일부 기능을 공유합니다.

Nowdoc은 Heredoc에 사용된 것과 동일한 <<< 시퀀스를 사용하지만 뒤에 오는 식별자는 작은 따옴표로 묶습니다. (<<< ‘EOT’) Nowdoc에도 Heredoc에 대한 모든 규칙이 동일하게 적용됩니다.

Example #8 Nowdoc 문자열 사용 예제

<?php
echo <<<'EOD'
여러 줄에 걸친 문자열의 예
Nowdoc을 사용합니다. 백슬래시는 문자 그대로 보여집니다.
예제, \\ 와 \'.
EOD;

위 예제는 다음과 같이 출력됩니다.

여러 줄에 걸친 문자열의 예
Nowdoc을 사용합니다. 백슬래시는 문자 그대로 보여집니다.
예제, \\ 와 \'.

Example #9 Nowdoc을 이용한 변수와 문자열 사용

<?php
class foo
{
    public $foo;
    public $bar;

    function __construct()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = '김철수';

echo <<<'EOT'
저의 이름은 "$name" 입니다. 저는 $foo->foo 를 출력합니다.
이번에는 {$foo->bar[1]} 를 출력합니다.
이것은 문자 'A'를 출력합니다: A: \x41
EOT;
?>

위 예제는 다음과 같이 출력됩니다.

저의 이름은 "$name" 입니다. 저는 $foo->foo 를 출력합니다.
이번에는 {$foo->bar[1]} 를 출력합니다.
이것은 문자 'A'를 출력합니다: A: \x41

Example #10 Nowdoc을 이용한 초기화

<?php
class foo {
    public $bar = <<<'EOT'
bar
EOT;
}
?>
참고 : Nowdoc은 PHP 5.3.0이후부터 동작합니다.     

변수 분석

큰 따옴표나 Heredoc으로 문자열을 지정하면 변수가 그 안에서 해석됩니다.

간단한 구문과 복잡한 구문, 두 가지 유형이 있습니다. 간단한 구문이 가장 일반적이고 편리합니다. 최소한의 노력으로 변수, 배열 값 또는 객체 속성을 문자열에 포함킬 수 있습니다.

복잡한 구문은 중괄호로 표현식을 묶어서 사용합니다.

간단한 구문

달러 기호($)가 사용된 이후 PHP는 [a-zA-Z_]+[a-zA-Z0-9_]* 정규 표현식에 해당하는 문자열(UTF-8 특수문자 또한 변수 이름으로 사용될 수 있습니다)을 유효한 변수 이름을 만들기 위하여 사용합니다. 명시적으로 이름의 끝을 지정하고자 하는 경우 중괄호로 변수 이름을 묶습니다.

<?php
$juice = "apple";

echo "He drank some $juice juice.".PHP_EOL;
// 유효하지 않습니다. "s"는 변수 이름에 유효하지만 변수는 $juice입니다.
echo "He drank some juice made of $juices.".PHP_EOL;
// 유효합니다. 사용하고자 하는 변수명을 중괄호로 묶어 명시적으로 지정합니다.
echo "He drank some juice made of ${juice}s.".PHP_EOL;
?>
참고 : PHP_EOL은 줄바꿈 문자와 동일한 역할으로 사용됩니다.

위 예제는 다음과 같이 출력됩니다.

He drank some apple juice.
He drank some juice made of .
He drank some juice made of apples.

유사한 방법으로 Array 인덱스 또는 객체 속성을 분석합니다. Array 인덱스의 경우 닫는 대괄호(])는 인덱스의 끝을 표시합니다. 간단한 구문괴 동일한 규칙이 객체 속성에 적용됩니다.

Example #11 간단한 구문 예제

<?php
$juices = array("apple", "orange", "koolaid1" => "purple");

echo "He drank some $juices[0] juice.".PHP_EOL;
echo "He drank some $juices[1] juice.".PHP_EOL;
echo "He drank some $juices[koolaid1] juice.".PHP_EOL;

class people {
    public $john = "John Smith";
    public $jane = "Jane Smith";
    public $robert = "Robert Paulsen";

    public $smith = "Smith";
}

$people = new people();

echo "$people->john drank some $juices[0] juice.".PHP_EOL;
echo "$people->john then said hello to $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;
echo "$people->robert greeted the two $people->smiths."; // 동작하지 않음
?>

위 예제는 다음과 같이 출력됩니다.

He drank some apple juice.
He drank some orange juice.
He drank some purple juice.
John Smith drank some apple juice.
John Smith then said hello to Jane Smith.
John Smith's wife greeted Robert Paulsen.
Robert Paulsen greeted the two .

PHP 7.1.0 이후 음수 인덱스도 지원됩니다.

Example #12 음수 인덱스

<?php
$string = 'string';
echo "문자열의 -2번째 인덱스는 $string[-2]입니다.", PHP_EOL;
$string[-3] = 'o';
echo "문자열의 -3번째 인덱스를 o로 바꾸면 ${string}이 됩니다.", PHP_EOL;
?>

위 예제는 다음과 같이 출력됩니다.

문자열의 -2번째 인덱스는 n입니다.
문자열의 -3번째 인덱스를 o로 바꾸면 strong이 됩니다.

더욱 복잡한 변수를 출력하기 위하여 복잡한 구문을 사용합니다.

복잡한 구문

구문이 복잡하기 때문에 어렵고 복잡한 내용이 아닙니다. 위의 일반적인 예제들보다 복잡한 표현을 사용할 수 있기 때문입니다.

String이 있는 스칼라 변수, 배열 요소 또는 객체 속성은 이 구문을 통해 포함될 수 있습니다. String 외부에서 사용하는 것과 같은 방식으로 표현식을 작성한 다음 중괄호로 줄바꿈하면 됩니다. 여는 중괄호는 단독으로 이스케이프 할 수 없으며, 이 구문은 달러 문자가 중괄호 바로 앞에 오는 경우에만 인식됩니다. 문자 {$을 얻으려면 {\$를 사용하십시오. 이에 관한 몇 가지 예제가 있습니다.

<?php
// 모든 에러를 출력합니다.
error_reporting(E_ALL);
$great = 'fantastic';

// 동작하지 않습니다. This is { fantastic}
echo "This is { $great}";

// 동작합니다. This is fantastic
echo "This is {$great}";

// 동작합니다.
echo "This square is {$square->width}00 centimeters broad.";

// 동작합니다. 키를 인용하는 경우 중괄호 구문을 사용해야 합니다.
echo "This works: {$arr['key']}";

// 동작합니다.
echo "This works: {$arr[4][3]}";

// $arr[foo]가 잘못되었습니다.
// 동작하는 구문이지만 PHP가 먼저 foo 이름을 가진 상수를 찾아야만 합니다.
// E_NOTICE (undefined constant) 오류가 발생합니다. 
echo "This is wrong: {$arr[foo][3]}";

// 동작합니다. 다차원 배열을 사용하는 경우 문자열 내부에서는
// 항상 배열 주위에 중괄호를 사용해야 합니다.
echo "This works: {$arr['foo'][3]}";

// 동작합니다.
echo "This works: " . $arr['foo'][3];
echo "This works too: {$obj->values[3]->name}";
echo "This is the value of the var named $name: {${$name}}";
echo "This is the value of the var named by the return value of getName(): ${getName()}}";
echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";

// 동작하지 않습니다. This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>

이 구문을 사용하여 문자열 내의 변수를 클래스 속성에 대입할 수도 있습니다.

<?php
class foo {
    var $bar = 'I am bar.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->{$baz[3]}}\n";
?>

위 예제는 다음과 같이 출력됩니다.

I am bar.
I am quux.
참고 : 중괄호 내부의 함수, 메소드 호출, 정적 클래스 변수 및 클래스 상수는 PHP 5부터 사용됩니다. 그러나 반환된 값은 문자열의 범위 내에서 변수의 이름으로 해석됩니다. 중괄호를 사용하여 함수, 메서드의 반환 값, 클래스 상수, 정적 클래스 변수의 값에 직접 액세스할 수 없습니다.
<?php
// 모든 에러를 출력합니다.
error_reporting(E_ALL);

class beers {
    const softdrink = 'rootbeer';
    public static $ale = 'ipa';
}

$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';

// 동작합니다. I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";

// 아래 구문 또한 동작합니다. I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>

문자별 String 읽기와 수정

String 내의 문자는 $str[42] 와 같이 Array의 대괄호를 이용하여 String 다음에 원하는 문자의 0부터 시작하는 오프셋을 지정하여 읽고 수정할 수 있습니다. 오프셋을 지정한 String은 문자 Array로 사용 가능합니다. substr(), substr_replace()는 둘 이상의 문자를 추출하거나 바꾸려고 할 때 사용할 수 있습니다.

참고 : PHP 7.1.0부터 음수 String 오프셋도 지원됩니다. String 끝에서 반대 방향으로 오프셋을 지정합니다.  PHP 7.1.0 이전에는 음수 오프셋이 읽기(비어있는 String)를 위한 E_NOTICE 와 쓰기(String을 그대로 둔 상태)를 위한 E_WARNING 오류를 출력했습니다. 
참고 : String 오프셋을 만들기 위한 목적으로 $str{42}와 같이 중괄호를 이용할 수도 있습니다. 
경고 : 범위를 벗어난 오프셋에 문자를 쓰면 문자열이 공백으로 채워집니다. 정수가 아닌 유형은 정수로 변환됩니다. 잘못된 오프셋 유형은 E_WARNING을 방출합니다. 할당된 문자열의 첫 문자만 사용됩니다. PHP 7.1.0부터 빈 문자열을 할당하면 치명적인 오류가 발생합니다. 이전에는 NULL 바이트를 할당했습니다. 
경고 : 내부적으로 PHP 문자열은 바이트 배열입니다 ISO-8859-1과 같은 1바이트 인코딩으로 된 문자열에서만 자료에 오프셋 접근을 이용할 수 있으며, 멀티 바이트 문자를 이용하는 경우 배열 괄호를 사용하여 문자열을 읽고 수정하는 경우 자료의 손상을 일으킬 수 있습니다.
참고 : PHP 7.1.0부터 빈 문자열에 빈 인덱스 연산자를 적용하면 치명적인 오류가 발생합니다. 이전에는 빈 문자열이 자동으로 배열로 변환되었습니다.

Example #13 String 오프셋 예제

<?php
// String의 첫번째 오프셋을 읽습니다.
$str = 'This is a test.';
$first = $str[0];

// String의 세번째 오프셋을 읽습니다. 
$third = $str[2];

// String의 마지막 오프셋을 읽습니다. 
$str = 'This is still a test.';
$last = $str[strlen($str)-1];

// String의 마지막 오프셋을 수정합니다. 
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?>

PHP 5.4에서 String 오프셋은 Integer 또는 Integer로 변환 가능한 String이어야 합니다. 그렇지 않으면 경고가 발생합니다. 이전에는 “foo”와 같은 오프셋이 자동으로 0으로 캐스트되었습니다.

Example #14 PHP 5.3과 PHP 5.4의 차이점

<?php
$str = 'abc' ;

var_dump ( $str [ '1' ]);
var_dump (isset( $str [ '1' ]));

var_dump ( $str [ '1.0' ]);
var_dump (isset( $str [ '1.0' ]));

var_dump ( $str [ 'x' ]);
var_dump (isset( $str [ 'x' ]));

var_dump ( $str [ '1x' ]);
var_dump (isset( $str [ '1x' ]));
?>

위 예제는 PHP 5.3에서 다음과 같이 출력됩니다.

string(1) "b"
bool(true)
string(1) "b"
bool(true)
string(1) "a"
bool(true)
string(1) "b"
bool(true)

위 예제는 PHP 5.4에서 다음과 같이 출력됩니다.

string(1) "b"
bool(true)

Warning: Illegal string offset '1.0' in /tmp/t.php on line 7
string(1) "b"
bool(false)

Warning: Illegal string offset 'x' in /tmp/t.php on line 9
string(1) "a"
bool(false)
string(1) "b"
bool(false)
참고 : [] 또는 {}를 사용하여 다른 유형의 변수(적절한 인터페이스를 구현하는 배열이나 객체는 포함하지 않음)에 액세스하면 자동으로 NULL이 반환됩니다.
참고 : PHP 5.5는 [] 또는 {}를 사용하여 String의 문자에 액세스할 수 있는 지원이 추가되었습니다. 

유용한 기능과 연산자

String은 ‘.’을 사용하여 연결할 수 있습니다. ‘+’ 연산자는 문자열을 연결하지 않습니다. 자세한 정보는 String연산자를 참조하십시오.

String 조작에 유용한 함수가 많이 있습니다.

일반 함수는 String 함수, 고급 찾기 및 바꾸기 기능은 Perl 호환 정규식 함수를 참조하십시오.

URL String을 인코딩, 디코딩할 수 있는 기능(Sodium 및 Hash)도 있습니다.

마지막으로 문자 유형 함수도 참조하십시오.


String으로 변환

(String) 캐스트 또는 strval()을 사용하여 값을 String으로 변환 할 수 있습니다. String 변환은 String이 필요한 표현식의 범위에서 자동으로 수행됩니다. echo 또는 print를 사용하거나 변수를 String과 비교할 때 발생 합니다. 유형과 형변환, settype()을 참조하십시오.

Boolean TRUE 값은 String “1”로 변환됩니다. Boolean FALSE는 “”(비어있는 문자열)로 변환됩니다. 이를 통해 Boolean 값과 String 값 사이를 전환할 수 있습니다.

Integer와 Float는 문자로 변환된 숫자를 나타내는 문자열로 변환됩니다(Float의 지수 부분 포함). Float는 지수 표기법(4.1E+6)을 사용하여 변환할 수 있습니다.

참고 : 소수점 문자는 스크립트의 로케일(범주 LC_NUMERIC)에 정의됩니다. setlocale()을 참조하십시오.

Array는 항상 문자열 Array로 변환됩니다. 이 때문에 echo 및 print 자체는 Array의 내용을 표시 할 수 없습니다. 단일 요소를 보려면 echo $array[‘foo’]와 같은 구성을 사용하십시오. 전체 내용을 보는 방법은 아래를 참조하십시오.

Object를 String 매직 메소드로 변환하려면 __toString을 사용해야 합니다.

Resource는 항상 구조 “Resource id #1″를 사용하여 String으로 변환되며, 여기서 1은 런타임시 PHP가 Resource에 할당한 Resource 번호입니다. 그러나 변환된 String의 정확한 구조에 의존해서는 안 되며 변경될 수 있습니다. 스크립트가 실행되는 동안(예: 웹 요청 또는 CLI 프로세스) 지정된 Resource 번호는 변경되지 않는 고유한 값을 지니며 재사용되지 않습니다. Resource의 형식을 얻으려면 get_resource_type()을 사용합니다.

NULL은 항상 빈 문자열로 변환됩니다.

위에서 설명한 것처럼 Array, Object, Resource를 String으로 직접 변환해도 해당 형식 이외의 값에 대한 유용한 정보는 제공되지 않습니다. 이러한 형식의 내용을 보다 효과적으로 검사하기 위하여 print_r() var_dump()를 참조하십시오.

영구 저장을 위해 대부분의 PHP 값을 문자열로 변환 할 수도 있습니다. 이 메소드를 직렬화라고하며 serialize()에 의해 수행됩니다.


String을 Integer 또는 Float로 변환

String을 Integer 또는 Float로 변환하여 사용하는 경우 결과 값과 유형은 다음과 같이 결정됩니다.

문자열에 ‘.’, ‘e’ 또는 ‘E’ 문자가 포함되어 있지 않고 숫자 값이 정수 형식 제한(PHP_INT_MAX에 정의됨)에 맞으면 String은 Integer로 평가됩니다. 다른 모든 경우에는 Float로 평가됩니다.

값은 String의 초기 부분에 의해 지정됩니다. String이 유효한 숫자 데이터로 시작하면 변환된 값이 Integer 또는 Float로 사용됩니다. 유효하지 않은 값의 경우 0(0)을 출력합니다. 유효한 숫자 데이터는 맨 앞에 양수 및 음수를 지정하기 위한 기호가 포함될 수 있습니다. 문맥에 따라 소수점이 사용될 수 있는 하나 이상의 숫자로 구성되고, 필요한 경우 지수를 사용할 수도 있습니다. 지수는 ‘e’ 또는 ‘E’이며 그 뒤에 하나 이상의 숫자로 구성됩니다.

<?php
$foo = 1 + "10.5";                // $foo는 Float입니다. (11.5)
$foo = 1 + "-1.3e3";              // $foo는 Float입니다. (-1299)
$foo = 1 + "bob-1.3e3";           // $foo는 Integer입니다. (1)
$foo = 1 + "bob3";                // $foo는 Integer입니다. (1)
$foo = 1 + "10 Small Pigs";       // $foo는 Integer입니다. (11)
$foo = 4 + "10.2 Little Piggies"; // $foo는 Float입니다. (14.2)
$foo = "10.0 pigs " + 1;          // $foo는 Float입니다. (11)
$foo = "10.0 pigs " + 1.0;        // $foo는 Float입니다. (11)
?>

이 변환에 대한 자세한 내용은 Strtod에 대한 유닉스 매뉴얼 페이지(3)를 참조하십시오.

이곳의 예제를 테스트하려면 위 예제를 잘라내어 줄 위에 붙여넣은 다음 결과를 확인합니다.

<?php
echo "\$foo==$foo; type is " . gettype ($foo) . "<br />\n";
?>

C언어와 같이 한 문자를 정수로 변환하는 작업은 불가능합니다. ord()chr()을 사용하여 ASCII 코드와 문자 간의 교환이 가능합니다.


String의 세부 사항

PHP의 String은 바이트 배열과 버퍼 길이를 나타내는 정수로 구현됩니다. 해당 바이트가 문자로 변환되는 방법에 대한 정보가 없으므로 해당 작업이 필요한 경우 프로그래머에가 직접 구현해야 합니다. String을 구성할 수 있는 값에는 제한이 없습니다. 특히, 값이 0인 바이트(“NUL 바이트”)는 문자열의 어느 곳에서나 허용됩니다. (이 매뉴얼에서 Binary safe가 아닌 몇 가지 함수는 NUL 바이트 이후의 데이터가 사용되지 않는 String을 라이브러리에 넘겨 줄 수 있습니다.)

String의 특성은 PHP에 별도의 바이트 유형이 없는 이유를 설명합니다. String이 단일 바이트의 역할을 수행합니다. 텍스트 데이터를 반환하지 않는 함수(예를 들면, 네트워크 소켓에서 읽은 임의의 데이터)는 여전히 String을 반환합니다.

PHP가 String에 대한 특정 인코딩을 지시하지 않는다면 사용되는 String이 어떻게 인코딩되는지 궁금할 것입니다. 예를 들어 문자열 “á”는 “\xE1” (ISO-8859-1), “\xC3\xA1” (UTF-8, C형식), “\x61\xCC\x81” (UTF-8, D형식), 또는 기타 다른 표현들이 사용될 수 있습니다. 답은 String이 스크립트 파일에 인코딩된 방식으로 인코딩된다는 것입니다. 따라서 스크립트가 ISO-8859-1로 작성된 경우 String은 ISO-8859-1으로 인코딩됩니다.

Zend Multibyte가 활성화 된 경우 스크립트는 임의의 인코딩(명시적으로 선언되거나 감지된 인코딩)으로 작성된 다음 특정 내부 인코딩으로 변환될 수 있으며, 스크립트 인코딩은 String에 사용됩니다.

스크립트 인코딩(또는 Zend Multibyte가 활성화 된 경우 내부 인코딩)은 UTF-8 또는 ISO-8859와 같은 ASCII의 상위 호환 집합을 사용해야 하는 제약이 있습니다. 하지만 동일한 바이트 값이 초기 및 비 초기 시프트 상태에서 사용될 수 있는 파일의 초기 상태에 의존하는 인코딩 지정은 문제가 될 수 있습니다.

String을 이용하여 작동하는 함수들이 긍정적으로 사용되기 위하여 String이 인코딩되는 방식에 대해 몇 가지 가정을 해야 할 수 있습니다. 불행히도 PHP의 함수 전반에 걸쳐 이 문제에 많은 변화가 필요합니다.

  • 일부 함수는 String이 일부 단일 바이트 인코딩으로 인코딩된다고 가정하지만 해당 바이트를 특정 문자로 해석할 필요는 없습니다. 예를 들어 substr(), strpos(), strlen(), strcmp()의 경우 함수를 이용하지 않고 메모리 버퍼에 접근하여 바이트 및 바이트 오프셋으로 작동할 수도 있습니다.
  • 다른 함수는 문자열의 인코딩을 전달하며, 이러한 정보가 제공되지 않으면 기본값으로 간주됩니다. 이것은 htmlentities() 및 mbstring 확장을 이용하는 함수들의 경우입니다.
  • strcasecmp(), strtoupper(), ucfirst()의 경우 지정된 로케일을 사용하지만(setlocale() 참조)바이트 단위로 작동합니다. 이는 인코딩이 로케일과 일치하는 단일 바이트 인코딩에만 사용할 수 있습니다. 예를 들어, 로케일이 올바르게 설정되고 á가 단일 바이트로 인코딩 된 경우 strtoupper(“á”)는 “Á”를 리턴할 수 있습니다. UTF-8로 인코딩된 경우 지정된 로케일에 따라 String이 손상되거나 리턴되지 않을 수 있습니다.
  • 마지막으로, String이 특정 인코딩(일반적으로 UTF-8)을 사용한다고 가정할 수 있습니다. 이것은 intl 확장과 PCRE 확장의 기능입니다(마지막의 경우 u수정자를 사용하는 경우에만). 이는 특수한 목적으로 인한 것이지만 utf8_decode()는 UTF-8 인코딩을 가정하고 utf8_encode()는 ISO-8859-1 인코딩을 가정합니다.

궁극적으로, 즉 유니코드를 사용하여 올바른 프로그램을 작성하는 것은 일반적으로 intl 및 bstring 확장에서 정상적으로 동작하는 함수를 필요에 따라 선택적으로 사용함과 동시에 동작하지 않는 함수를 회피하는 것입니다. 그러나 유니코드 인코딩을 처리할 수 있는 함수를 사용하는 것은 시작에 불과합니다. 언어가 제공하는 기능에 관계없이 유니코드 사양을 아는 것이 필수적입니다. 예를 들어, 스크립트 내에서 사용되는 문자가 대문자와 소문자만 있다고 가정하는 프로그램은 잘못된 가정을 하고 있습니다.

The source of this document is at PHP.net.   
php  ccl-by-4.0

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다