문자열(Strings)

문자열은 문자가 바이트와 동일한 일련의 문자입니다. 즉, PHP는 256자 세트만 지원하므로 기본 유니코드 지원을 제공하지 않습니다. 문자열 유형의 세부사항을 참조하십시오.

참고: 32비트 빌드에서 문자열은 최대 2GB(최대 2147483647바이트)까지 커질 수 있습니다.

구문

문자열 리터럴은 네 가지 방법으로 지정할 수 있습니다.

Single quoted

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

리터럴 작은 따옴표를 지정하려면 백슬래시(\)로 이스케이프하십시오. 리터럴 백슬래시를 지정하려면 두 번(\\)합니다. 다른 모든 백슬래시 인스턴스는 리터럴 백슬래시로 처리됩니다. 즉, \r 또는 \n과 같이 익숙한 다른 이스케이프 시퀀스가 ​​특별한 의미가 아니라 문자 그대로 지정된 대로 출력됩니다.

참고: 큰따옴표heredoc 구문과 달리 특수 문자에 대한 변수 및 이스케이프 시퀀스는 작은따옴표 문자열에서 발생할 때 확장되지 않습니다.

                  
<?php
echo 'this is a simple string';

echo 'You can also have embedded newlines in
strings this way as it is
okay to do';

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

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

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

// Outputs: This will not expand: \n a newline
echo 'This will not expand: \n a newline';

// Outputs: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
                  
                
Double quoted

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

Escaped characters

Sequence Meaning
\n linefeed (LF or 0x0A (10) in ASCII)
\r carriage return (CR or 0x0D (13) in ASCII)
\t horizontal tab (HT or 0x09 (9) in ASCII)
\v vertical tab (VT or 0x0B (11) in ASCII)
\e escape (ESC or 0x1B (27) in ASCII)
\f form feed (FF or 0x0C (12) in ASCII)
\\ backslash
\$ dollar sign
\" double-quote
\[0-7]{1,3} the sequence of characters matching the regular expression is a character in octal notation, which silently overflows to fit in a byte (e.g. "\400" === "\000")
\x[0-9A-Fa-f]{1,2} the sequence of characters matching the regular expression is a character in hexadecimal notation
\u{[0-9A-Fa-f]+} the sequence of characters matching the regular expression is a Unicode codepoint, which will be output to the string as that codepoint's UTF-8 representation

작은 따옴표로 묶인 문자열과 마찬가지로 다른 문자를 이스케이프하면 백슬래시도 인쇄됩니다.

큰따옴표 문자열의 가장 중요한 기능은 변수 이름이 확장된다는 사실입니다. 자세한 내용은 문자열 구문 분석을 참조하세요.

Heredoc

문자열을 구분하는 세 번째 방법은 heredoc 구문입니다. <<<. 이 연산자 다음에 식별자가 제공되고 그 다음 줄 바꿈이 제공됩니다. 문자열 자체가 뒤따른 다음 동일한 식별자를 다시 사용하여 인용문을 닫습니다.

닫는 식별자는 공백이나 탭으로 들여쓰기될 수 있으며, 이 경우 들여쓰기는 문서 문자열의 모든 줄에서 제거됩니다. PHP 7.3.0 이전에는 닫는 식별자가 줄의 첫 번째 열에서 시작해야 합니다.

또한 닫는 식별자는 PHP의 다른 레이블과 동일한 명명 규칙을 따라야 합니다. 영숫자 문자와 밑줄만 포함해야 하며 숫자가 아닌 문자나 밑줄로 시작해야 합니다.

예제 #1 PHP 7.3.0의 기본 Heredoc 예제

                  
<?php
// no indentation
echo <<<END
      a
     b
    c
\n
END;

// 4 spaces of indentation
echo <<<END
      a
     b
    c
    END;
                  
                

PHP 7.3에서 위 예제의 출력:

          a
        b
      c

    a
  b
c
                

닫는 식별자가 본문의 어떤 줄보다 더 들여쓰기되면 ParseError가 발생합니다.

예제 #2 닫는 식별자는 본문의 어떤 줄보다 들여쓰면 안 됩니다.

                  
<?php
echo <<<END
  a
 b
c
   END;
                  
                

PHP 7.3에서 위 예제의 출력:

PHP Parse error:  Invalid body indentation level (expecting an indentation level of at least 3) in example.php on line 4

닫는 식별자가 들여쓰기되면 탭도 사용할 수 있지만 닫는 식별자의 들여쓰기와 본문의 들여쓰기(닫는 식별자까지)와 관련하여 탭과 공백을 혼용해서는 안 됩니다. 이러한 경우 ParseError가 발생합니다. 들여쓰기를 위해 탭과 공백을 혼합하면 가독성에 해롭기 때문에 이러한 공백 제약 조건이 포함되었습니다.

예제 #3 본문(공백) 닫는 식별자에 대한 다른 들여쓰기

                  
<?php
// All the following code do not work.

// different indentation for body (spaces) ending marker (tabs)
{
    echo <<<END
     a
        END;
}

// mixing spaces and tabs in body
{
    echo <<<END
        a
     END;
}

// mixing spaces and tabs in ending marker
{
    echo <<<END
          a
         END;
}
                  
                

PHP 7.3에서 위 예제의 출력:

PHP Parse error:  Invalid indentation - tabs and spaces cannot be mixed in example.php line 8

본문 문자열의 닫는 식별자 뒤에 세미콜론이나 줄 바꿈이 올 필요는 없습니다. 예를 들어 다음 코드는 PHP 7.3.0부터 허용됩니다.

예제 #4 닫는 식별자 뒤에 표현식 계속하기

                  
<?php
$values = [<<<END
a
  b
    c
END, 'd e f'];
var_dump($values);
                  
                

PHP 7.3에서 위 예제의 출력:

                  
array(2) {
  [0] =>
  string(11) "a
  b
    c"
  [1] =>
  string(5) "d e f"
}
                  
                

경고 닫는 식별자가 줄의 시작 부분에서 발견되면 다른 단어의 일부인지 여부에 관계없이 닫는 식별자로 간주되어 ParseError가 발생합니다.

예제 #5 문자열 본문에서 식별자를 닫으면 ParseError가 발생하는 경향이 있습니다.

                    
<?php
$values = [<<<END
a
b
END ING
END, 'd e f'];
                    
                  

PHP 7.3에서 위 예제의 출력:

PHP Parse error:  syntax error, unexpected identifier "ING", expecting "]" in example.php on line 6

이 문제를 방지하려면 텍스트 본문에 표시되는 닫는 식별자를 선택하지 않는 간단한 규칙을 따르는 것이 안전합니다.

경고 PHP 7.3.0 이전에는 닫는 식별자가 있는 줄에 세미콜론(;)을 제외하고 다른 문자가 포함되어서는 안 된다는 점에 유의하는 것이 매우 중요합니다. 이는 특히 식별자가 들여쓰기되지 않을 수 있고 세미콜론 앞뒤에 공백이나 탭이 없을 수 있음을 의미합니다. 닫는 식별자 앞의 첫 번째 문자는 로컬 운영 체제에서 정의한 줄 바꿈이어야 합니다. macOS를 포함한 UNIX 시스템의 \n입니다. 닫는 구분 기호 뒤에 줄 바꿈도 와야 합니다.

이 규칙이 깨지고 닫는 식별자가 "깨끗"하지 않으면 닫는 식별자로 간주되지 않으며 PHP는 계속해서 찾습니다. 현재 파일이 끝나기 전에 적절한 닫는 식별자를 찾지 못하면 마지막 줄에서 구문 분석 오류가 발생합니다.

예제 #6 잘못된 예제, PHP 7.3.0 이전

                    
<?php
class foo {
    public $bar = <<<EOT
bar
    EOT;
}
// Identifier must not be indented
?>
                    
                  

예제 #7 PHP 7.3.0 이전에도 유효한 예제

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

변수를 포함하는 heredocs는 클래스 속성을 초기화하는 데 사용할 수 없습니다.

Heredoc 텍스트는 큰따옴표 없이 큰따옴표로 묶인 문자열처럼 작동합니다. 이것은 heredoc의 따옴표를 이스케이프할 필요가 없지만 위에 나열된 이스케이프 코드를 계속 사용할 수 있음을 의미합니다. 변수는 확장되지만 heredoc 내에서 문자열과 마찬가지로 복잡한 변수를 표현할 때도 동일한 주의를 기울여야 합니다.

예제 #8 Heredoc 문자열 인용 예제

                  
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

/* More complex example, with variables. */
class foo
{
    var $foo;
    var $bar;

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

$foo = new foo();
$name = 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>
                  
                

위의 예는 다음을 출력합니다.

My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A
                

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

예제 #9 인수 예제의 Heredoc

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

Heredoc 구문을 사용하여 정적 변수 및 클래스 속성/상수를 초기화할 수 있습니다.

예제 #10 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;
}
?>
                  
                

여는 Heredoc 식별자는 선택적으로 큰따옴표로 묶을 수 있습니다.

예제 #11 Heredoc에서 큰따옴표 사용하기

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

Nowdocs는 작은따옴표 문자열에 대한 것이며 heredocs는 큰따옴표 문자열에 대한 것입니다. nowdoc은 heredoc과 유사하게 지정되지만 nowdoc 내에서는 구문 분석이 수행되지 않습니다. 이 구조는 이스케이프할 필요 없이 PHP 코드 또는 기타 큰 텍스트 블록을 포함하는 데 이상적입니다. 구문 분석용이 아닌 텍스트 블록을 선언한다는 점에서 SGML <![CDATA[ ]]> 구성과 몇 가지 공통된 기능을 공유합니다.

nowdoc은 heredocs에 사용된 것과 동일한 <<< 시퀀스로 식별되지만 뒤에 오는 식별자는 작은 따옴표로 묶입니다.e.g. <<<'EOT'. heredoc 식별자에 대한 모든 규칙은 nowdoc 식별자, 특히 닫는 식별자의 모양과 관련된 규칙에도 적용됩니다.

예제 #12 Nowdoc 문자열 인용 예제

                  
<?php
echo <<<'EOD'
Example of string spanning multiple lines
using nowdoc syntax. Backslashes are always treated literally,
e.g. \\ and \'.
EOD;
                  
                

위의 예는 다음을 출력합니다.

Example of string spanning multiple lines
using nowdoc syntax. Backslashes are always treated literally,
e.g. \\ and \'.
                

예제 #13 변수가 있는 Nowdoc 문자열 인용 예제

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

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

$foo = new foo();
$name = 'MyName';

echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
EOT;
?>
                  
                

위의 예는 다음을 출력합니다.

My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
                

예제 #14 정적 데이터 예

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

문자열이 큰따옴표로 지정되거나 heredoc으로 지정되면 변수가 그 안에서 구문 분석됩니다.

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

복잡한 구문은 표현식을 둘러싼 중괄호로 인식할 수 있습니다.

Simple syntax

달러 기호($)가 발생하면 파서는 유효한 변수 이름을 형성하기 위해 최대한 많은 토큰을 탐욕스럽게 사용합니다. 이름의 끝을 명시적으로 지정하려면 변수 이름을 중괄호로 묶습니다.

                  
<?php
$juice = "apple";

echo "He drank some $juice juice.".PHP_EOL;
// Invalid. "s" is a valid character for a variable name, but the variable is $juice.
echo "He drank some juice made of $juices.";
// Valid. Explicitly specify the end of the variable name by enclosing it in braces:
echo "He drank some juice made of ${juice}s.";
?>
                  
                

위의 예는 다음을 출력합니다.

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

마찬가지로 배열 인덱스 또는 개체 속성을 구문 분석할 수 있습니다. 배열 인덱스에서 닫는 대괄호(])는 인덱스의 끝을 표시합니다. 단순 변수와 동일한 규칙이 개체 속성에 적용됩니다.

예제 #15 간단한 구문 예제

                  
<?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."; // Won't work
?>
                  
                

위의 예는 다음을 출력합니다.

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부터 음수 인덱스도 지원됩니다.

예제 #16 음수 인덱스

                  
<?php
$string = 'string';
echo "The character at index -2 is $string[-2].", PHP_EOL;
$string[-3] = 'o';
echo "Changing the character at index -3 to o gives $string.", PHP_EOL;
?>
                  
                

위의 예는 다음을 출력합니다.

The character at index -2 is n.
Changing the character at index -3 to o gives strong.
                

더 복잡한 경우에는 복잡한 구문을 사용해야 합니다.

Complex (curly) syntax

이것은 구문이 복잡하기 때문에 복합이라고 하는 것이 아니라 복합 표현식을 사용할 수 있기 때문입니다.

문자열 표현이 있는 모든 스칼라 변수, 배열 요소 또는 객체 속성은 이 구문을 통해 포함될 수 있습니다. 표현식은 문자열 외부에 나타나는 것과 동일한 방식으로 작성된 다음 {}로 래핑됩니다. {는 이스케이프할 수 없으므로 이 구문은 ${ 바로 다음에 올 때만 인식됩니다. 리터럴 {$를 얻으려면 {\$를 사용하십시오. 명확하게 하기 위한 몇 가지 예:

                  
<?php
// Show all errors
error_reporting(E_ALL);

$great = 'fantastic';

// Won't work, outputs: This is { fantastic}
echo "This is { $great}";

// Works, outputs: This is fantastic
echo "This is {$great}";

// Works
echo "This square is {$square->width}00 centimeters broad.";


// Works, quoted keys only work using the curly brace syntax
echo "This works: {$arr['key']}";


// Works
echo "This works: {$arr[4][3]}";

// This is wrong for the same reason as $foo[bar] is wrong  outside a string.
// In other words, it will still work, but only because PHP first looks for a
// constant named foo; an error of level E_NOTICE (undefined constant) will be
// thrown.
echo "This is wrong: {$arr[foo][3]}";

// Works. When using multi-dimensional arrays, always use braces around arrays
// when inside of strings
echo "This works: {$arr['foo'][3]}";

// Works.
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()}}";

// Won't work, outputs: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";

// Won't work, outputs: C:\folder\{fantastic}.txt
echo "C:\folder\{$great}.txt"
// Works, outputs: C:\folder\fantastic.txt
echo "C:\\folder\\{$great}.txt"
?>
                  
                

이 구문을 사용하여 문자열 내의 변수를 사용하여 클래스 속성에 액세스하는 것도 가능합니다.

                  
<?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[1]}}\n";
?>
                  
                

위의 예는 다음을 출력합니다.

I am bar.
I am bar.
                

메모: {$} 내부의 함수, 메서드 호출, 정적 클래스 변수 및 클래스 상수에서 액세스한 값은 문자열이 정의된 범위의 변수 이름으로 해석됩니다. 단일 중괄호({})를 사용하면 함수나 메서드의 반환 값이나 클래스 상수 또는 정적 클래스 변수의 값에 액세스할 수 없습니다.

                  
<?php
// Show all errors.
error_reporting(E_ALL);

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

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

// This works; outputs: I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";

// This works too; outputs: I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>
                  
                
문자에 의한 문자열 접근 및 수정

문자열 내의 문자는 $str{42}에서와 같이 대괄호를 사용하여 문자열 뒤에 원하는 문자의 0부터 시작하는 오프셋을 지정하여 액세스하고 수정할 수 있습니다. 이 목적을 위해 문자열을 문자 배열로 생각하십시오. substr()substr_replace() 함수는 2개 이상의 문자를 추출하거나 교체하려는 경우 사용할 수 있습니다.

참고: PHP 7.1.0부터 음수 문자열 오프셋도 지원됩니다. 이들은 문자열 끝에서 오프셋을 지정합니다. 이전에 음수 오프셋은 읽기(빈 문자열 생성)에 대해 E_NOTICE를, 쓰기(문자열을 건드리지 않은 상태로 유지)에 대해 E_WARNING을 내보냈습니다.

참고: PHP 8.0.0 이전에는 같은 목적으로 $str{42}에서와 같이 중괄호를 사용하여 문자열에 액세스할 수도 있었습니다. 이 중괄호 구문은 PHP 7.4.0부터 더 이상 사용되지 않으며 PHP 8.0.0부터 더 이상 지원되지 않습니다.

경고: 범위를 벗어난 오프셋에 쓰는 것은 문자열을 공백으로 채웁니다. 정수가 아닌 유형은 정수로 변환됩니다. 잘못된 오프셋 유형은 E_WARNING을 내보냅니다. 할당된 문자열의 첫 번째 문자만 사용됩니다. PHP 7.1.0부터 빈 문자열을 할당하면 치명적인 오류가 발생합니다. 이전에는 NULL 바이트를 할당했습니다.

경고: 내부적으로 PHP 문자열은 바이트 배열입니다. 결과적으로 배열 대괄호를 사용하여 문자열에 액세스하거나 수정하는 것은 다중 바이트 안전하지 않으며 ISO-8859-1과 같은 단일 바이트 인코딩으로 된 문자열로만 수행해야 합니다.

참고: PHP 7.1.0부터 빈 문자열에 빈 인덱스 연산자를 적용하면 치명적인 오류가 발생합니다. 이전에는 빈 문자열이 자동으로 배열로 변환되었습니다.

예제 #17 일부 문자열 예제

                  
<?php
// Get the first character of a string
$str = 'This is a test.';
$first = $str[0];

// Get the third character of a string
$third = $str[2];

// Get the last character of a string.
$str = 'This is still a test.';
$last = $str[strlen($str)-1];

// Modify the last character of a string
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';

?>
                  
                

문자열 오프셋은 정수 또는 정수와 같은 문자열이어야 합니다. 그렇지 않으면 경고가 발생합니다.

예제 #18 잘못된 문자열 오프셋의 예

                  
<?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']));
?>
                  
                

위의 예는 다음을 출력합니다.

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 7.4에서 더 이상 사용되지 않습니다. 이것은 PHP 8.0에서 제거되었습니다.

유용한 함수 및 연산자

문자열은 '.'를 사용하여 연결할 수 있습니다. (점) 연산자. '+'(더하기) 연산자는 이에 대해 작동하지 않습니다. 자세한 내용은 문자열 연산자를 참조하세요.

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

일반 함수에 대해서는 문자열 함수 섹션을 참조하고 고급 찾기 및 바꾸기 기능에 대해서는 Perl 호환 정규식 함수를 참조하십시오.

URL 문자열에 대한 함수과 문자열(SodiumHash)을 암호화/복호화하는 함수도 있습니다.

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

문자열로 변환

(문자열) 캐스트 또는 strval() 함수를 사용하여 값을 문자열로 변환할 수 있습니다. 문자열 변환은 문자열이 필요한 표현식의 범위에서 자동으로 수행됩니다. 이것은 echo 또는 print 함수를 사용하거나 변수를 문자열과 비교할 때 발생합니다. 유형유형 저글링에 대한 섹션에서는 다음을 더 명확하게 설명합니다. settype() 함수도 참조하십시오.

bool true 값은 문자열 "1"로 변환됩니다. bool false""(빈 문자열)로 변환됩니다. 이렇게 하면 bool 값과 문자열 값 사이를 앞뒤로 변환할 수 있습니다.

int 또는 float는 숫자를 텍스트로 나타내는 문자열로 변환됩니다(float의 지수 부분 포함). 부동 소수점 숫자는 지수 표기법(4.1E+6)을 사용하여 변환할 수 있습니다.

메모: PHP 8.0.0부터 소수점 문자는 항상 .. PHP 8.0.0 이전에는 소수점 문자가 스크립트의 로케일(카테고리 LC_NUMERIC)에 정의되어 있습니다. setlocale() 함수를 참조하십시오.

배열은 항상 "Array" 문자열로 변환됩니다. 이 때문에 echoprint는 그 자체로 배열의 내용을 보여줄 수 없습니다. 단일 요소를 보려면 echo $arr['foo']와 같은 구성을 사용하십시오. 전체 콘텐츠 보기에 대한 팁은 아래를 참조하세요.

개체를 문자열로 변환하려면 __toString 메서드를 사용해야 합니다.

리소스는 항상 "Resource id #1" 구조의 문자열로 변환됩니다. 여기서 1은 런타임에 PHP가 리소스에 할당한 리소스 번호입니다. 이 문자열의 정확한 구조는 의존해서는 안 되며 변경될 수 있지만 스크립트가 실행되는 동안(예: 웹 요청 또는 CLI 프로세스) 주어진 리소스에 대해 항상 고유하며 재사용되지 않습니다. . 리소스 유형을 얻으려면 get_resource_type() 함수를 사용하십시오.

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

위에서 언급했듯이 배열, 개체 또는 리소스를 문자열로 직접 변환하는 것은 해당 유형 이상의 값에 대한 유용한 정보를 제공하지 않습니다. 이러한 유형의 내용을 검사하는 보다 효과적인 방법은 print_r()var_dump() 함수를 참조하십시오.

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

문자열 유형의 세부사항

PHP의 문자열은 바이트 배열과 버퍼 길이를 나타내는 정수로 구현됩니다. 해당 바이트가 문자로 변환되는 방식에 대한 정보가 없으므로 해당 작업은 프로그래머에게 맡겨집니다. 문자열을 구성할 수 있는 값에는 제한이 없습니다. 특히 값이 0인 바이트("NUL 바이트")는 문자열의 어느 곳에서나 허용됩니다(그러나 이 설명서에서 "바이너리 세이프"하지 않은 일부 함수는 널 바이트.)

문자열 유형의 이러한 특성은 PHP에 별도의 "바이트" 유형이 없는 이유를 설명합니다. 문자열이 이 역할을 합니다. 예를 들어 네트워크 소켓에서 읽은 임의의 데이터와 같이 텍스트 데이터를 반환하지 않는 함수는 여전히 문자열을 반환합니다.

PHP가 문자열에 대한 특정 인코딩을 지시하지 않는다는 점을 감안할 때 문자열 리터럴이 어떻게 인코딩되는지 궁금할 수 있습니다. 예를 들어, 문자열 "á""\xE1"(ISO-8859-1), "\xC3\xA1"(UTF-8, C 형식), "\x61\xCC\x81"(UTF-8 , D 형식) 또는 다른 가능한 표현? 대답은 문자열이 스크립트 파일에 인코딩된 방식에 관계없이 인코딩된다는 것입니다. 따라서 스크립트가 ISO-8859-1로 작성된 경우 문자열은 ISO-8859-1 등으로 인코딩됩니다. 그러나 Zend Multibyte가 활성화된 경우에는 적용되지 않습니다. 이 경우 스크립트는 임의의 인코딩(명시적으로 선언되거나 감지됨)으로 작성된 다음 특정 내부 인코딩으로 변환될 수 있습니다. 그러면 이 인코딩이 문자열 리터럴에 사용될 인코딩입니다. 스크립트 인코딩(또는 Zend Multibyte를 활성화해야 하는 내부 인코딩)에는 몇 가지 제약이 있습니다. 이는 거의 항상 이 인코딩이 UTF-8 또는 ISO-8859와 같은 호환 가능한 ASCII 상위 집합이어야 함을 의미합니다. -1. 그러나 초기 및 비초기 시프트 상태에서 동일한 바이트 값을 사용할 수 있는 상태 종속 인코딩은 문제가 될 수 있습니다.

물론, 텍스트에서 작동하는 함수가 유용하려면 문자열이 인코딩되는 방식에 대해 몇 가지 가정을 해야 할 수 있습니다. 불행히도 PHP의 기능 전반에 걸쳐 이 문제에 대해 많은 변형이 있습니다.

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

궁극적으로 이것은 유니코드를 사용하여 올바른 프로그램을 작성하는 것이 작동하지 않고 데이터를 손상시킬 가능성이 가장 높은 함수를 주의 깊게 피하고 대신 일반적으로 intlmbstring 확장에서 올바르게 작동하는 함수를 사용하는 것에 달려 있음을 의미합니다. 그러나 유니코드 인코딩을 처리할 수 있는 함수를 사용하는 것은 시작에 불과합니다. 언어가 제공하는 기능에 관계없이 유니코드 사양을 아는 것은 필수적입니다. 예를 들어, 대문자와 소문자만 있다고 가정하는 프로그램은 잘못된 가정을 하고 있습니다.