2017-12-30 1 views
0

나는 7.1.0이 문맥에서 "빈 문자열 할당"의 의미는 무엇입니까?

내가 전역 범위 오프셋 패드의 부족에 쓰기 [1]

경고 [PHP 매뉴얼의 문자열 부분]에서 혼란 텍스트 다음 올 PHP를 사용하고 있습니다 공백을 포함한 캐릭터 라인 정수가 아닌 형식은 정수로 변환됩니다. 잘못된 오프셋 유형은 E_NOTICE을 내 보냅니다. 지정된 문자열의 첫 번째 문자 만 사용됩니다. PHP 7.1.0의 으로 빈 문자열을 할당하면 심각한 오류가 발생합니다. 이전에는 NULL 바이트가 할당되었습니다.

나는

위의 텍스트에서 조항의 의미를 이해하기 위해 열심히 노력 "할당 된 문자열의 첫 번째 문자가 사용됩니다."

는 "PHP 7.1.0로, 빈 문자열을 지정하는 것은 치명적인 오류가 발생합니다. 을 이전, 그것은 NULL 바이트를 할당."

위의 두 문장 중 첫 번째 문장을 전혀 이해하지 못합니다.

두 번째 문장의 경우 실제 코드를 통해 이해하려고 노력했습니다. 그래서, 그것을 위해 다음 코드를 썼지 만,이 코드가 매뉴얼의 진술이 말하고자하는 것을 증명하는지 확신 할 수 없습니다. 다음은 제 코드입니다. 그것으로부터, 문장을 정확하게 이해하고 코드를 올바르게 작성했는지 또는 PHP 매뉴얼에서 문장의 의미를 설명 하는지를 알려주십시오. 내가 잘못하고있다면, PHP 매뉴얼의 내용을 준수하도록 코드를 수정하십시오.

코드 조각 : PHP 7.1.0에서

<?php 
$rootbeer = 'A & W'; 
$rootbeer[] = 'N'; 
?> 

출력 : PHP 5.6.30에서

Fatal error: Uncaught Error: [] operator not supported for strings in hello.php:3 Stack trace: #0 {main} thrown in hello.php on line 3 

출력 :

Fatal error: [] operator not supported for strings in hello.php on line 3 

위의 두 출력에서 ​​어디에도 보이지 않습니다. PHP 5.6.30NULL 바이트이 무언가에 할당되고 있습니다. 두 버전 모두에서 거의 동일한 출력, 동일한 오류가 발생합니다.

출력의 차이를 PHP 7.1.0 및 PHP 5.6.30으로 보여주십시오. 차이점을 이해하는 것이 더 나을 것입니다.

답변

3

빈 문자열을 할당하거나 범위를 벗어난 오프셋을 사용하고 있지 않습니다.

<?php 
$rootbeer = 'A & W'; 
$rootbeer[7] = ''; 
echo $rootbeer; 

이것은 PHP 5.6 및 출력 문서에 언급 된 패딩 문자열을 잘 작동합니다 : 난 당신 같은 외모를 시도하려는 코드가 생각합니다.

PHP 7.1 이상, 당신은 경고를 얻을 것이다

PHP 경고 : 라인 3

에 yourfile.php의 오프셋 (offset) 문자열로 빈 문자열을 할당하지 및 문자열은하지 않습니다 수 변경 될 수 있습니다.

+0

이 사실을 알고 있습니다. > "PHP 7.1.0에서 빈 문자열을 할당하면 치명적인 오류가 발생하지만 코드에서 경고를내는 것뿐입니다. 코드에서 치명적인 오류가 발생했음을 보여주지 못합니다. – user2839497

+1

그것은 정말로 수수께끼입니다. [PHP 인터프리터] (https://github.com/php/php-src/)의 소스를 살펴본 결과이 경고는 실제로 버전 7.1에서 소개되었습니다. 구현에 동의하지 않는 것입니까? 올바른 버전에서 동작 변경이 일어난 것은 이상한 우연한 결과입니다. – jsfan

+0

감사의 말씀 감사드립니다. "PHP 7.1 이상 .0, 빈 인덱스 연산자를 문자열에 적용하면 치명적인 오류가 발생합니다. 이전에 문자열이 자동으로 배열로 변환되었습니다. "적절한 대구 표를 예로 들자면 다시 한 번 감사드립니다. 회신을 기다리고 있습니다 – user2839497