PHP에서 작은따옴표와 큰따옴표의 차이점은 무엇입니까? PHP에서 작은따옴표와 큰따옴표 문자열의 차이점은 무엇입니까? 문자열 유형 구현 세부정보

PHP의 따옴표가 단일 또는 이중일 수 있다는 것은 비밀이 아닙니다. 따옴표의 특정 용도가 언제 더 적절한지 알아봅시다.

작은따옴표

문자열을 정의하는 가장 간단한 방법은 텍스트를 작은따옴표로 묶는 것입니다.

텍스트에 작은따옴표를 사용해야 하는 경우 슬래시(\)를 사용하여 이스케이프 처리해야 합니다.

작은따옴표 안의 이스케이프 시퀀스는 작동하지 않습니다.

작은따옴표 사용 예:

큰따옴표

큰따옴표로 텍스트를 강조 표시하면 문자열은 작은따옴표와 동일한 방식으로 정의됩니다. 그러나 물론 인용문에는 차이가 있습니다.

이스케이프 따옴표의 상황은 작은 따옴표의 경우와 동일합니다.

큰따옴표로 묶인 문자열은 특수 문자에 대한 대부분의 이스케이프 시퀀스를 인식합니다.

가장 중요한 차이점은 큰따옴표가 변수를 처리한다는 사실입니다.

큰따옴표 사용 예:

큰따옴표가 있는 문자열이 변수를 처리한다는 사실에 초점을 맞춰 보겠습니다.

문자열이 처리되면 어떻게 되나요? 통역사 변수에 대해 큰따옴표로 각 문자열을 확인하세요., 즉. 강제 구문 분석이 발생하므로 추가 시간이 걸립니다. 예, 종종 이는 매우 짧은 순간이지만 사실 자체를 이해해야 합니다. 즉, 한 문자열의 처리를 다른 따옴표(물론 변수 없이)와 비교하면 작은 따옴표가 있는 문자열이 확실히 더 빠르게 처리됩니다.

계산

ProfiPHP 웹사이트에서 나는 다음과 같은 흥미로운 계산을 발견했습니다. 이 주제. 저자는 문자열을 처리하는 데 걸리는 시간을 계산하는 간단한 스크립트를 작성했습니다.

이 짧은 기사에서는 사용 방법과 위치를 보여줍니다. PHP의 따옴표.

PHP의 작은따옴표(아포스트로피)

작은따옴표로 묶인 문자열은 PHP에서 어떤 방식으로도 처리되지 않습니다. 즉, 작은따옴표는 그 사이에 포함된 텍스트를 있는 그대로 나타냅니다.

// 올바른 에코 "인생은 어때?"; echo "잘 지내세요? $name"; echo "잘 지내세요?".$name; // 잘못된 echo "잘 지내세요? $name";

작은따옴표와 큰따옴표 안의 특수 문자

예를 들어 탭 문자(\t)가 슬래시 및 문자 t가 아닌 탭 문자로 해석되도록 하려면 탭 문자가 포함된 텍스트 줄을 큰따옴표로 묶어야 합니다. \' 및 \\는 작은따옴표로만 사용할 수 있습니다. 다른 모든 이스케이프 시퀀스(\n, \r, \$ 등)는 작은따옴표 안에 허용되지 않습니다.

// 잘못된 에코 "잘 지내세요?\n"; // 올바른 에코 "잘 지내세요?\n";

문자열 내에서 큰따옴표를 이스케이프하려면 백슬래시 \" 앞에 따옴표를 넣으세요.

// 잘못된 에코 "

무슨 일이야?

"; // 올바른 에코 "

무슨 일이야?

"; 에코 "

무슨 일이야?

";

PHP의 큰따옴표

큰따옴표로 묶인 텍스트는 매우 다르게 처리됩니다. 예를 들어, 큰따옴표로 묶인 변수는 해당 값으로 대체됩니다. 이렇게 하면 컴파일이 편리해집니다 SQL 쿼리큰따옴표를 사용합니다.

$query = "INSERT INTO 테이블(게시물, 작성자, 텍스트, 날짜) VALUES ("$id","$author","$text","$date"");

저는 PHP 프로그래밍 전문가는 아니지만 PHP에서 작은따옴표, 때로는 큰따옴표로 묶인 문자열이 포함된 일부 코드를 보는 이유가 약간 혼란스럽습니다.

.NET이나 C 언어에서 작은따옴표로 묶인 경우 문자열이 아니라 문자라는 뜻입니다.

해결책

당신이 알아야 할 것

$a = "이름"; $b = "나의 $a"; == "내 이름" $c = "내 $a"; != "내 이름"

PHP에서는 작은따옴표를 사용하여 "a" , "my name" , "abc xyz" 와 같은 상수 문자열을 정의하고, 큰따옴표를 사용하여 "a $b $c $d" 와 같은 식별자를 포함하는 문자열을 정의합니다.

그리고 또 다른 점은

"내 이름"을 에코합니다.

보다 빠른

"내 이름"을 에코합니다.

에코 "나의" . $a;

보다 느림

"나의 $a"를 에코합니다.

이는 사용된 다른 문자열에도 해당됩니다.

PHP에서 작은따옴표 안의 텍스트는 문자열 값으로 처리되는 반면, 큰따옴표 안의 텍스트는 해당 값을 바꾸고 처리하여 변수를 구문 분석합니다.

$test = "변수"; echo "안녕하세요 $test 선생님"; // 출력은 다음과 같습니다: Hello Mr 변수 echo "Hello Mr $test"; // 출력은 다음과 같습니다: Hello Mr $test

여기서 큰따옴표는 값을 구문 분석하고 작은따옴표는 $test 변수를 구문 분석하지 않고 문자열 값으로 처리됩니다.

두 종류의 중첩 문자는 모두 문자열입니다. 한 유형의 인용을 사용하여 다른 유형의 인용을 마무리하는 것이 편리합니다. """ 및 """ . 따옴표 유형 간의 가장 큰 차이점은 중첩된 식별자 참조가 작은 따옴표 내부가 아닌 큰 따옴표 내부로 대체된다는 것입니다.

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

문자열 내에서 작은따옴표를 사용하려면 백슬래시( \ ). 백슬래시 자체를 작성해야 하는 경우 이를 복제합니다( \\ ). 다른 모든 백슬래시 사용은 일반 문자로 해석됩니다. 즉, 다음과 같은 다른 이스케이프 시퀀스를 사용하려고 하면 \아르 자형또는 \N, 특별한 동작 대신 있는 그대로 출력됩니다.

에코 "이것은 간단한 문자열입니다";

에코 "줄에 삽입할 수도 있습니다.
개행 문자는 다음과 같습니다.
이건 괜찮아"
;

// 출력: Arnold는 "나는 돌아올 것이다"라고 말한 적이 있습니다.
에코 "어느 날 Arnold는 '나는 돌아올 것이다'라고 말했습니다.";

에코 "C:\\*.*를 삭제하셨나요?";

// 출력: C:\*.*를 삭제하셨나요?
echo "C:\*.*를 삭제하셨나요?" ;

// 출력: 확장되지 않습니다: \n 개행
에코 "이것은 확장되지 않습니다: \n 개행";

// 출력: $expand 및 $either 변수는 확장되지 않습니다.
에코 "$expand 및 $either 변수는 확장되지 않습니다.";
?>

큰따옴표

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

이스케이프 시퀀스
후속 시퀀스 의미
\N 개행(ASCII에서는 LF 또는 0x0A(10))
\아르 자형 캐리지 리턴(CR 또는 ASCII의 0x0D(13))
\티 가로 탭(HT 또는 ASCII의 0x09(9))
\V 수직 탭(ASCII의 VT 또는 0x0B(11))(PHP 5.2.5부터)
\이자형 이스케이프 문자(ASCII에서는 ESC 또는 0x1B(27))(PHP 5.4.4부터)
\에프 페이지 피드(ASCII의 FF 또는 0x0C(12))(PHP 5.2.5부터)
\\ 백슬래시
\$ 달러 표시
\" 큰따옴표
\{1,3} 8진수 체계의 문자 정규식에 해당하는 문자 시퀀스
\x(1,2) 16진수 표기법으로 된 문자의 정규식에 해당하는 문자 시퀀스

작은따옴표로 묶인 문자열과 마찬가지로 문자를 이스케이프하면 백슬래시 자체도 출력됩니다. PHP 5.1.1 이전에는 백슬래시를 사용했습니다. \($var)출판되지 않았습니다.

Heredoc

문자열을 정의하는 세 번째 방법은 heredoc 구문을 사용하는 것입니다. <<< . 이 연산자 뒤에는 식별자를 지정하고 줄 바꿈을 지정해야 합니다. 그 다음에는 줄 자체가 나오고 그 다음에는 동일한 식별자가 나타나 삽입을 닫습니다.

~ 해야 하다닫는 식별자로 시작합니다. 즉, 행의 첫 번째 열에 나타나야 합니다. 또한 식별자는 PHP의 다른 모든 태그와 동일한 명명 규칙을 따라야 합니다. 즉, 영숫자와 밑줄만 포함해야 하며 숫자로 시작해서는 안 됩니다(밑줄은 허용됨).

주목

닫는 식별자 줄에는 세미콜론( ; ). 즉, 아이디는 들여쓰기하면 안 된다세미콜론 앞이나 뒤에는 공백이나 탭이 있을 수 없습니다. 닫는 식별자 앞의 첫 번째 문자는 운영 체제에서 정의한 대로 개행 문자여야 한다는 점을 이해하는 것도 중요합니다. 예를 들어, Mac OS X를 포함한 UNIX 시스템에서는 다음과 같습니다. \N. 새 줄은 닫는 식별자 바로 뒤에도 시작되어야 합니다.

이 규칙을 위반하고 닫는 식별자가 "깨끗"하지 않은 경우 닫는 식별자는 누락된 것으로 간주되며 PHP는 계속해서 이를 추가로 찾습니다. 이 경우 올바른 종료 식별자를 찾을 수 없으면 스크립트 끝에 있는 줄 번호에 구문 분석 오류가 발생합니다.

Heredoc은 클래스 필드를 초기화하는 데 사용할 수 없습니다. PHP 5.3부터 이 제한은 변수를 포함하는 heredoc에만 적용됩니다.

예시 #1 잘못된 예시

클래스 foo(
공개 $bar =<<술집
EOT;
}
?>

Heredoc 텍스트는 큰따옴표가 없어도 문자열과 동일한 방식으로 동작합니다. 이는 heredoc에서 따옴표를 이스케이프 처리할 필요가 없지만 위의 이스케이프 시퀀스를 계속 사용할 수 있음을 의미합니다. 변수는 처리되지만 heredoc 내에서 복잡한 변수를 사용할 때는 문자열로 작업할 때만큼 주의해야 합니다.

예 #2 heredoc 문자열 정의 예

$str =<<예시라인,
여러 줄을 다루고,
heredoc 구문을 사용합니다.
EOD;

클래스 foo
{
var $foo ;
var $bar ;

함수 foo()
{
$this -> foo = "푸" ;
$이것 ->
}
}

$foo = 새로운 foo();
$name = "내 이름" ;

에코<<내 이름은 "$name"입니다. $foo -> foo를 입력합니다. .
이제 나는 추론 중입니다.
( $foo -> 바 [ 1 ]) .
그러면 대문자 "A"가 출력됩니다: \x41
EOT;
?>

내 이름은 "MyName"입니다. 저는 Foo를 입력합니다. 이제 Bar2를 출력합니다. 그러면 대문자 "A"가 출력됩니다: A

함수 인수를 통해 데이터를 전달하기 위해 heredoc 구문을 사용하는 것도 가능합니다:

버전 5.3.0부터 heredoc 구문을 사용하여 정적 변수 및 클래스 속성/상수를 초기화하는 것이 가능해졌습니다.

예제 #4 heredoc을 사용하여 정적 변수 초기화

// 정적 변수
함수 foo()
{
정적 $bar =<<여기에는 아무것도 없습니다...
상표;
}

// 클래스 속성/상수
클래스 foo
{
const 바 =<<상수 사용 예
푸바;

공개 $baz =<<필드 사용 예
푸바;
}
?>

PHP 5.3.0부터는 Heredoc 식별자를 큰따옴표로 묶을 수도 있습니다.

나우독

Nowdoc은 작은 따옴표로 묶인 문자열에 대해 heredoc이 큰 따옴표로 묶인 문자열에 대해 동일합니다. Nowdoc은 heredoc과 유사하지만 그 안에 대체가 이루어지지 않습니다. 이 디자인은 이스케이프 처리 없이 PHP 코드나 기타 큰 텍스트 블록을 삽입하는 데 이상적입니다. 이는 SGML 구성과 약간 유사합니다. 처리할 의도가 없는 텍스트 블록을 선언합니다.

Nowdoc은 동일한 순서로 표시됩니다. <<< , heredoc에서 사용되지만 다음 식별자는 작은따옴표로 묶여 있습니다. 예를 들어, <<<"EOT" . heredoc 식별자에 적용되는 모든 조건은 nowdoc에도 적용되며, 특히 닫는 식별자에 적용되는 조건은 더욱 그렇습니다.

예제 #6 Nowdoc 예제

$str =<<<"EOD"
예시 텍스트,
여러 줄에 걸쳐
nowdoc 구문을 사용합니다.
EOD;

/* 변수를 사용하는 더 복잡한 예입니다. */
클래스 foo
{
공개 $foo ;
공개 $bar ;

함수 foo()
{
$this -> foo = "푸" ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}

$foo = 새로운 foo();
$name = "내 이름" ;

에코<<<"EOT"
내 이름은 "$name"입니다. $foo->foo를 인쇄합니다.
이제 ($foo->bar)를 인쇄합니다.
대문자 "A"를 출력해서는 안 됩니다. \x41
EOT;
?>

이 예제를 실행한 결과는 다음과 같습니다.

내 이름은 "$name"입니다. $foo->foo를 인쇄합니다. 이제 ($foo->bar)를 인쇄합니다. 대문자 "A"를 출력해서는 안 됩니다. \x41

논평:

heredoc과 달리 nowdoc는 정적 데이터가 있는 모든 컨텍스트에서 사용할 수 있습니다. 클래스 필드 또는 상수 초기화의 일반적인 예:

예 #7 정적 데이터 사용 예

클래스 foo(
공개 $bar =<<<"EOT"
술집
EOT;
}
?>

논평:

nowdoc 지원은 PHP 5.3.0에 추가되었습니다.

변수 처리

문자열이 큰따옴표로 지정되거나 heredoc를 사용하여 지정되면 그 안의 변수가 처리됩니다.

구문에는 단순형과 복합형의 두 가지 유형이 있습니다. 간단한 구문이 더 쉽고 편리합니다. 변수, 배열 값( 정렬) 또는 객체 속성( 물체) 최소한의 노력으로.

복잡한 구문은 표현식을 묶는 중괄호로 식별할 수 있습니다.

간단한 구문

통역사가 달러 기호( $ ), 유효한 변수 이름을 형성하기 위해 가능한 한 많은 문자를 캡처합니다. 이름의 끝을 지정하려면 변수 이름을 중괄호로 묶습니다.

$juice = "사과" ;

echo "그는 $juice 주스를 마셨어요." . PHP_EOL ;
// 작동하지 않습니다. "s"는 변수 이름에 유효한 문자입니다.
// 하지만 변수 이름은 $juice입니다.
echo "그는 $juices로 만든 주스를 마셨습니다." ;
?>

이 예제를 실행한 결과는 다음과 같습니다.

그는 사과 주스를 조금 마셨다. 그는 로 만든 주스를 마셨다.

배열 요소( 정렬) 또는 객체 속성( 물체). 배열 인덱스에는 닫는 대괄호( ] )은 인덱스 정의의 끝을 표시합니다. 단순 변수와 동일한 규칙이 객체 속성에 적용됩니다.

예제 #8 간단한 구문 예제

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

echo "그는 $juices [ 0 ] 주스를 마셨습니다." . PHP_EOL ;
echo "그는 $juices [ 1 ] 주스를 마셨습니다." . PHP_EOL ;
echo "그는 $juices [ koolaid1 ] 주스를 마셨습니다." . PHP_EOL ;

클래스 사람들 (
공개 $john = "존 스미스" ;
공개 $jane = "제인 스미스" ;
public $robert = "로버트 폴슨" ;

공개 $smith = "스미스" ;
}

$사람 = 새로운 사람();

echo "$people -> John은 $juices [ 0 ] 주스를 마셨습니다." . PHP_EOL ;
echo " $people -> john이 $people -> jane에게 인사했습니다." . PHP_EOL ;
echo "$people -> john "의 아내가 $people -> robert에게 인사했습니다." . PHP_EOL;
echo " $people -> 로버트가 $people -> 대장장이 두 명에게 인사를 했습니다." ; // 작동하지 않습니다
?>

이 예제를 실행한 결과는 다음과 같습니다.

그는 사과 주스를 조금 마셨다. 그는 오렌지 주스를 마셨다. 그는 보라색 주스를 마셨다. John Smith는 사과 주스를 마셨습니다. John Smith는 Jane Smith에게 인사를 했습니다. John Smith의 아내가 Robert Paulsen에게 인사했습니다. Robert Paulsen이 두 사람에게 인사했습니다.

더 복잡한 경우에는 복잡한 구문을 사용하세요.

복잡한(곱슬) 구문

이해하기 어려워서가 아니라, 복잡한 표현을 사용할 수 있게 해주기 때문에 복잡하다고 합니다.

문자열에 매핑된 모든 스칼라 변수, 배열 요소 또는 객체 속성은 이 구문을 사용하여 문자열로 표현할 수 있습니다. 줄 바깥에서와 같은 방식으로 표현식을 작성한 다음 줄 바꿈하면 됩니다. { 그리고 } . 왜냐하면 { 이스케이프할 수 없습니다. 이 구문은 다음 경우에만 인식됩니다. $ 직접 따르다 { . 사용 {\$ 인쇄하다 {$ . 몇 가지 예시:

// 모든 오류 표시
error_reporting(E_ALL);

$great = "훌륭함" ;

// 작동하지 않음, 출력: 이것은 (훌륭합니다)
echo "이것은 ( $great )" ;

// 작동, 출력: 훌륭해요
echo "이것은 ( $great ) " ;
echo "$( 훌륭해요 ) " ;

// 작동
에코 "이 광장은 넓다.( $square -> 너비 ) 00cm." ;

// 작동합니다. 인용된 키워드는 중괄호 구문에서만 작동합니다.
echo "이것은 작동합니다: ( $arr [ "key" ]) " ;

// 작동
echo "이것은 작동합니다: ( $arr [ 4 ][ 3 ]) " ;

// 외부의 $foo와 같은 이유로 유효하지 않습니다.
// 라인. 즉, 여전히 작동합니다.
// 그러나 PHP는 상수 foo를 먼저 찾기 때문에
// 레벨 오류 E_NOTICE(정의되지 않은 상수).
에코 "그것은 옳지 않다:( $arr [ foo ][ 3 ]) " ;

// 작동합니다. 내부적으로 다차원 배열을 사용하는 경우
// 줄은 항상 중괄호를 사용합니다.
echo "이것은 작동합니다: ( $arr [ "foo" ][ 3 ]) " ;

// 작동합니다.
echo "이것은 작동합니다: " . $arr [ "foo" ][ 3 ];

에코 "이것도 작동합니다.( $obj -> 값 ​​[ 3 ]-> 이름 ) " ;

에코 "이것은 이름이 지정된 변수의 값입니다.$이름 : ($( $이름 )) " ;

에코 "이것은 getName() 함수에서 반환된 이름의 변수 값입니다.($( getName ())) " ;

에코 "이것은 \$object->getName()이 반환하는 이름별 변수 값입니다.($( $object -> getName ())) " ;

// 작동하지 않음, 출력: getName()이 반환하는 것: (getName())
에코 "getName()이 반환하는 내용은 다음과 같습니다. (getName())";
?>

이 구문을 사용하여 문자열 내의 개체 속성에 액세스하는 것도 가능합니다.

클래스 foo(
var $bar = "나는 바입니다." ;
}

$foo = 새로운 foo();
$bar = "바" ;
$baz = array("foo" , "bar" , "baz" , "quux" );
echo " ( $foo -> $bar ) \n" ;
echo " ( $foo -> $baz [ 1 ]) \n" ;
?>

이 예제를 실행한 결과는 다음과 같습니다.

나는 바입니다. 나는 바입니다.

논평:

함수, 메서드 호출, 정적 클래스 변수 및 클래스 상수는 내부적으로 작동합니다. {$} , PHP 5부터. 그러나 제공된 값은 해당 값이 정의된 행과 동일한 컨텍스트에서 변수 이름으로 처리됩니다. 단일 중괄호 사용( {} )은 함수, 메소드, 클래스 상수 또는 정적 클래스 변수의 값에 액세스하는 데 작동하지 않습니다.

// 모든 오류 표시
error_reporting(E_ALL);

클래스 맥주 (
const 소프트드링크 = "루트비어" ;
공개 정적 $ale = "ipa" ;
}

$rootbeer = "A & W" ;
$ipa = "알렉산더 키스\"s" ;

// 작동하고 출력: A & W를 원합니다.
echo "($( 맥주 :: 소프트드링크 )) \n" ;

// 이것도 작동합니다. 출력: Alexander Keith의 것을 원합니다.
echo "($( 맥주 :: $ale )) \n" ;
?>

문자열의 문자 액세스 및 변경

문자열의 문자는 문자열 뒤의 대괄호 안에 0부터 시작하여 문자열 시작 부분의 오프셋을 지정하여 사용하고 수정할 수 있습니다(예: $str ). 이 목적을 위해 문자열을 문자 배열로 생각하십시오. 2개 이상의 문자를 가져오거나 바꿔야 하는 경우 다음 기능을 사용할 수 있습니다. 하위 문자열()그리고 하위 문자열 교체().

논평: 문자열의 문자는 중괄호를 사용하여 액세스할 수도 있습니다(예: $str(42) ).

주목

줄 경계를 넘어서는 오프셋에 쓰려고 하면 해당 오프셋까지의 공백으로 문자열이 채워집니다. 정수가 아닌 유형은 정수 유형으로 변환됩니다. 잘못된 오프셋 유형으로 인해 레벨 오류가 발생합니다. E_공지사항. 음수 오프셋에 쓰면 레벨 오류가 발생합니다. E_공지사항, 읽으면 빈 문자열이 반환됩니다. 할당된 문자열의 첫 번째 문자만 사용됩니다. 빈 문자열에 할당하면 널 바이트(NULL)가 할당됩니다.

주목

PHP의 문자열은 내부적으로 바이트 배열입니다. 결과적으로 오프셋에서 문자열에 액세스하거나 수정하는 것은 다중 바이트 인코딩에 안전하지 않으며 ISO-8859-1과 같은 단일 바이트 인코딩의 문자열에 대해서만 수행되어야 합니다.

예시 #9 몇 가지 예시 문자열

// 문자열의 첫 번째 문자를 가져옵니다.
$str = "이것은 테스트입니다." ;
$first = $str [ 0 ];

// 문자열의 세 번째 문자를 가져옵니다.
$세 번째 = $str [ 2 ];

// 문자열의 마지막 문자를 가져옵니다.
$str = "이것은 아직 테스트입니다." ;
$last = $str [ strlen ($str ) - 1 ];

// 줄의 마지막 문자를 변경합니다.
$str = "바다를 보세요" ;
$str [ strlen ($str )- 1 ] = "e" ;

?>

PHP 5.4부터 문자열의 오프셋은 정수 또는 숫자가 포함된 문자열로 지정되어야 합니다. 그렇지 않으면 경고가 발생합니다. 이전에는 다음과 같은 문자열로 오프셋이 제공되었습니다. "푸", 예고 없이 다음과 같이 변형되었습니다. 0 .

예제 #10 PHP 5.3과 PHP 5.4의 차이점

$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에서 이 예제를 실행한 결과는 다음과 같습니다.

문자열(1) "b" bool(true) 문자열(1) "b" bool(true) 문자열(1) "a" bool(true) 문자열(1) "b" bool(true)

PHP 5.4에서 이 예제를 실행한 결과는 다음과 같습니다.

string(1) "b" bool(true) 경고: 7행의 /tmp/t.php에 잘못된 문자열 오프셋 "1.0"이 있습니다. string(1) "b" bool(false) 경고: /에 잘못된 문자열 오프셋 "x"가 있습니다. 9번째 줄의 tmp/t.php string(1) "a" bool(false) string(1) "b" bool(false)

논평:

다음을 사용하여 다른 유형의 변수(특정 인터페이스를 구현하는 배열이나 객체 제외)에 액세스하려고 합니다. 또는 {} 조용히 돌아올 것이다 없는.

논평:

PHP 5.5에는 구문을 사용하여 문자열 리터럴의 문자에 액세스하는 지원이 추가되었습니다. 또는 {} .

문자열을 수정하는 데 유용한 함수가 많이 있습니다.

기본 함수는 문자열 함수 섹션에 설명되어 있으며, 고급 검색 및 바꾸기, 정규식 또는 Perl 호환 정규식 함수에 대해서는 설명되어 있습니다.

문자열로 변환

캐스트를 사용하여 값을 문자열로 변환할 수 있습니다. (끈), 또는 함수 strval(). 문자열이 필요한 표현식에서는 변환이 자동으로 발생합니다. 함수를 사용할 때 이런 일이 발생합니다. 에코또는 인쇄, 또는 변수 값을 문자열과 비교할 때. 매뉴얼의 유형 및 유형 조작 섹션을 읽으면 다음 내용이 더 명확해집니다. 또한보십시오 세트타입().

배열은 항상 문자열로 변환됩니다. "정렬"이므로 배열의 내용을 표시할 수 없습니다( 정렬), 사용 에코또는 인쇄그 내용을 보려면. 단일 요소를 보려면 다음과 같은 것을 사용하십시오. 에코 $arr["foo"]. 모든 콘텐츠를 표시/보는 방법에 대한 팁은 아래를 참조하세요.

PHP 4의 객체는 항상 문자열로 변환되었습니다. "물체". 객체의 필드 값을 표시하려는 경우( 물체) 디버깅을 위해서는 계속 읽어보세요. 필요한 객체의 클래스 이름을 얻으려면 다음을 사용하십시오. get_class(). PHP 5부터 __toString 메소드도 사용할 수 있게 되었습니다.

없는항상 빈 문자열로 변환됩니다.

위에서 볼 수 있듯이 배열이나 객체, 리소스를 문자열로 직접 변환해도 해당 유형 외에 값 자체에 대한 유용한 정보는 제공되지 않습니다. 디버깅을 위해 값을 출력하는 더 좋은 방법은 함수를 사용하는 것입니다. print_r()그리고 var_dump().

PHP의 대부분의 값은 영구 저장을 위해 문자열로 변환될 수 있습니다. 이 방법을 직렬화라고 하며 다음 함수를 사용하여 수행할 수 있습니다. 직렬화(). 또한 PHP 설치에 WDDX 지원이 있는 경우 XML 구조로의 직렬화도 가능합니다.

문자열을 숫자로 변환

문자열이 숫자값으로 인식되면 결과 값과 유형은 다음과 같이 결정됩니다.

문자열에 문자 ".", "e" 또는 "E"가 포함되어 있지 않고 숫자 값이 정수 범위(정의됨)에 속하는 경우 PHP_INT_MAX), 문자열은 정수( 정수). 다른 모든 경우에는 부동 소수점 숫자로 간주됩니다( 뜨다).

값은 문자열의 시작 부분에 따라 결정됩니다. 행이 유효한 숫자 값으로 시작하면 해당 값이 사용됩니다. 그렇지 않으면 값은 0이 됩니다. 유효한 숫자 값은 하나 이상의 숫자(소수점이 포함될 수 있음)이며 선택적으로 앞에 기호가 오고 그 뒤에 선택적 지수가 옵니다. 지수는 "e" 또는 "E" 뒤에 하나 이상의 숫자가 옵니다.

$foo = 1 + "10.5" ; // $foo는 부동 소수점입니다(11.5).
$foo = 1 + "-1.3e3" ; // $foo는 부동 소수점입니다(-1299).
$foo = 1 + "bob-1.3e3" ; // $foo는 정수입니다 (1)
$foo = 1 + "bob3" ; // $foo는 정수입니다 (1)
$foo = 1 + "작은 돼지 10마리" ; // $foo는 정수입니다(11).
$foo = 4 + "10.2 작은 돼지" ; // $foo는 부동 소수점입니다(14.2).
$foo = "돼지 10.0마리" + 1 ; // $foo는 부동 소수점입니다(11)
$foo = "10.0돼지" + 1.0; // $foo는 부동 소수점입니다(11)
?>

자세한 정보이 변환에 대한 자세한 내용은 Unix 설명서의 strtod(3) 섹션을 참조하세요.

이 섹션의 예제를 테스트하려면 해당 예제와 다음 줄을 복사하여 붙여넣고 어떤 일이 발생하는지 확인하세요.

echo "\$foo== $foo ; 유형: " . gettype($foo) . "
\N" ;
?>

문자를 정수로 변환하여 문자 코드를 얻을 것이라고 기대하지 마십시오(예를 들어 C에서 수행된 것처럼). 문자를 ASCII 코드로 변환하거나 그 반대로 변환하려면 다음 함수를 사용하십시오. 주문()그리고 문자().

문자열 유형 구현 세부정보

문자열 유형( )는 PHP에서 바이트 배열과 버퍼 길이를 포함하는 정수로 구현됩니다. 여기에는 이러한 바이트를 문자로 변환하는 방법에 대한 정보가 포함되어 있지 않으며 이 작업은 프로그래머에게 맡깁니다. 값이 있는 바이트와 같은 문자열의 내용에는 제한이 없습니다. 0 ("NUL" 바이트)는 어디에나 위치할 수 있습니다(그러나 이 설명서에 명시된 일부 기능은 "바이너리 안전"이 아닙니다. 즉, NUL -byte 이후의 데이터를 무시하는 라이브러리에 문자열을 전달할 수 있습니다).

문자열 유형의 이러한 특성은 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-1과 같은 ASCII의 상위 집합이어야 합니다. 또한 초기 및 비초기 시프트 상태에서 동일한 바이트 값을 사용할 수 있는 상태 종속 인코딩은 문제를 일으킬 수 있습니다.

물론 문자열 함수가 유용하려면 문자열 인코딩에 대해 몇 가지 가정을 해야 합니다. 불행하게도 PHP 함수 중에는 이 문제에 대한 매우 다양한 접근 방식이 있습니다.

  • 일부 함수는 문자열이 일부 단일 바이트 인코딩으로 인코딩되었다고 가정하지만 올바르게 작동하기 위해 바이트를 특정 문자로 해석할 필요는 없습니다. 이 카테고리에는 예를 들어 다음이 포함됩니다. 하위 문자열(), strpos(), strlen()그리고 strcmp(). 이러한 함수에 대해 생각하는 또 다른 방법은 메모리 버퍼에서 작동한다는 것입니다. 바이트와 ​​해당 오프셋을 사용하여 직접 작업합니다. 오프셋.
  • 다른 함수에서는 인코딩이 매개변수로 전달될 것으로 예상하며, 인코딩 매개변수가 지정되지 않은 경우 일부 기본 인코딩을 가정할 수도 있습니다. 이 기능은
  • 마지막으로 문자열이 특정 인코딩, 일반적으로 UTF-8을 사용한다고 가정하는 함수가 있습니다. intl 및 PCRE 확장의 대부분의 기능이 여기에 해당됩니다(후자의 경우 수정자를 지정할 때만 해당). ). 이는 의도적으로 수행되었지만 기능은 utf8_디코드() UTF-8 인코딩을 의미하며, utf8_encode()- ISO-8859-1.

궁극적으로 유니코드에서 작동하는 올바른 프로그램을 작성한다는 것은 유니코드에서 작동하지 않고 데이터를 손상시킬 가능성이 있는 함수를 조심스럽게 피하고 대신 일반적으로 intl 및 mbstring 확장의 유효한 함수를 사용하는 것을 의미합니다. 그러나 유니코드 지원 함수를 사용하는 것이 좋은 시작입니다. 언어가 제공하는 기능에 관계없이 유니코드 사양 자체를 알아야 합니다. 예를 들어, 프로그램이 언어에 소문자와 대문자만 존재한다고 가정한다면 이는 큰 실수를 범하는 것입니다.

문자열 형식을 지정하려면 아포스트로피 또는 큰따옴표 중 어떤 유형의 따옴표를 사용해야 합니까?

PHP에서 큰따옴표와 작은따옴표의 차이점을 살펴보고 예제를 사용하여 언제 어느 것을 사용해야 하는지 알아보세요.

작은따옴표로 묶인 문자열에 있는 특수 문자에 대한 변수 및 이스케이프 시퀀스는 처리되지 않습니다. 아포스트로피로 묶인 문자열은 큰따옴표로 묶인 유사한 문자열보다 PHP 인터프리터에서 훨씬 빠르게 처리됩니다.

그 이유는 간단합니다. PHP 인터프리터는 큰따옴표로 묶인 문자열에서 변수가 있는지 추가로 확인하고 변수가 발견되면 변수 이름 대신 해당 값이 문자열에 삽입됩니다. 그러나 아포스트로피로 묶인 줄은 인터프리터에 의해 일반 텍스트로 인식되며 PHP는 이 줄에서 어떤 변환도 수행하지 않습니다. 어쨌든 작은따옴표로 묶인 문자열을 처리하는 것이 더 빠르다는 것은 분명하다고 생각합니다.

먼저 문자열을 정의하는 방법을 설명한 다음 작은따옴표로 묶인 문자열을 처리하는 속도가 얼마나 빨라지는지 확인해 보겠습니다.

문자열을 정의하는 가장 간단한 방법은 문자열을 작은따옴표(")로 묶는 것입니다. 작은따옴표로 묶인 문자열 내에서 작은따옴표를 사용하려면 문자열 앞에 백슬래시(\)를 붙여야 합니다. 즉, 이스케이프 처리해야 합니다. 작은따옴표 앞이나 줄 끝에 있으면 이를 복제해야 합니다. 다른 문자를 이스케이프하려고 하면 백슬래시도 인쇄됩니다.

다음은 작은따옴표를 사용하는 예입니다.
// 출력: 단순 문자열
echo "간단한 문자열";
// 인쇄: 나 여기 있어요
echo "나 여기 있어요";
// 출력: 삽입되지 않습니다: \n 새 줄
echo "다음 항목은 삽입되지 않습니다:\nnewline";
// 출력: $example 변수도 대체되지 않습니다.
echo "$example 변수도 대체되지 않습니다."; 문자열이 큰따옴표(")로 묶여 있으면 PHP는 문자열을 인식합니다. 많은 분량특수 문자에 대한 시퀀스를 제어하고 문자열의 변수 이름 대신 해당 값을 대체합니다. 작은따옴표와 마찬가지로 큰따옴표로 묶인 문자열 내에서 큰따옴표를 사용하려면 앞에 백슬래시 문자(\)가 와야 합니다.

다음은 큰따옴표를 사용하는 예입니다.
// 출력: 단순 문자열
echo "간단한 문자열";
// 출력: 회사 "Snowdrop"
echo "회사 \"Snowdrop\"";
// 출력: 그러면 새 줄이 생성됩니다.
echo "새 줄로 넘어갑니다 \n";
// 출력: 변수가 대체됩니다.
$example = "대체됩니다";
echo "변수 $example"; 또한 "\n" 시퀀스( 새 줄), HTML이 아닌 일반 텍스트의 경우 "\r"(캐리지 리턴)입니다. 따라서 브라우저에서는 변경 사항을 볼 수 없습니다( 소스 코드페이지).

작은따옴표가 큰따옴표보다 얼마나 빠른지 알아봅시다. 측정을 위해 간단한 테스트 스크립트를 작성하고, 직접 테스트할 경우 PC나 서버의 하드웨어에 따라 결과가 달라질 수 있다는 점을 즉시 알려드립니다.
// 루프 시작 부분의 타임스탬프를 반환합니다.
$start = 마이크로타임(true);
// 100만번의 반복을 위한 루프 생성
($i = 0; $i< 1000000; $i++) {
$text = "여기에 문자열이 있습니다.";
}
// 소요된 시간을 계산합니다.
$time = (마이크로타임(true) - $start); 결과: 0.09초.

작은따옴표를 큰따옴표로 바꾸면:
$text = "여기에 문자열이 있습니다."; 결과는 0.10초가 됩니다.

보시다시피, 텍스트 문자열을 사용할 때 실행 시간의 차이는 매우 작으며 전혀 존재하지 않는다고 말할 수도 있습니다. 문자열과 변수를 결합하려고 할 때 재미가 시작됩니다.
$text = "여기에 문자열 $i가 있습니다."; 또는
$text = $i."여기에 문자열이 있습니다."; 결과는 대략 0.27초입니다.

그 차이는 꽤 눈에 띕니다. 연결과 큰따옴표는 변수가 문자열에 추가될 때 성능에 분명히 영향을 미칩니다.

서버는 코드를 처리할 때 변수, 상수 등에 대한 큰따옴표의 모든 내용을 확인합니다. 시간이 걸린다. 그리고 서버는 작은 따옴표 사이에 있는 내용을 미리 만들어진 텍스트로 처리하고 거기에 무엇이 있는지는 신경 쓰지 않습니다. 작은따옴표와 큰따옴표의 성능 차이는 매우 작지만 로드가 많은 프로젝트를 개발하는 경우 몇 밀리초 절약은 이미 승리입니다.