는 최근 SO에 대한 답변을 작성하고 난 내가 내 (다음) 코딩 스타일로 인해 몰랐 PHP에서 이상한 동작입니다 무슨 생각을 알게되었다 :concat 연산자와 float 식별자의 우선 순위 '.' (T_CONSTANT_ENCAPSED_STRING, T_DNUMBER)
$var = 1;
echo "test string ". $var+1 ." example";
이 내가 1
과 .
사이의 공간을 제거하지만 경우에, 잘 작동 :
echo "test string ". $var+1." example";
그것은 예상이 사건을 나에게 T_CONSTANT_ENCAPSED_STRING
구문 분석 오류를주고으로하는 ','
또는 매우 잘못 ';'
.
그리고 네 .. 그것과 같이 작동합니다 :이와 데 문제는 오류 메시지가 구체적으로 무엇의 기본 문제를 반영하지 않는다는 점이다
echo "test string ".($var+1)." example";
다른 메시지가 대부분 정확한 위치에 있고 올바른 위치를 원합니다.
나는 처음에 나는 여전히 부동 소수점 연산자는 다음과 같은 시나리오에서 CONCAT 연산자보다 우선 왜 이해 힘든 시간을 이것의 원인으로 포인트를 떠 기대하지 않았지만 :
var_dump(.1, 1, 1., 1.0);
var_dump(1.."a", "a"..1, 1.0."a");
플로트 (0.1), INT (1), 플로트 (1), 플로트 (1)
캐릭터 (2) "1A", 스트링 (4) "± 0.1"캐릭터 (2) "1A"
이제는 산술 연산자가 문자열 연산보다 먼저 수행되어야한다는 것을 이해하지만 여기서는 하지 않습니다
".1
및 1."
는 .
는 CONCAT 연산자임을 표시해야하고 1.1
는 .
는 플로트에 대한 식별자임을 표시해야합니다. 대신 둘 다 구문 분석 오류를 제공합니다. 왜 모든 float로 1.
을 분석
var_dump(1 + 1.); // float(2)
var_dump(1. + 1); // float(2)
당신은 단순히 플로트에 추가 + 1
을 사용할 수 있습니다 : 그것은 변수 유형에 올 때
PHP는 까다 롭고 아닌 언어인가? 구문 분석 오류는 다음 토큰에서 발생합니다.이 토큰에서 숫자는 예상되며 concat 연산자가 될 수 없습니다.echo 1."test"
출력 1test
는 현재 기존 코드를 깰 수있는 것인지
그래서 제 질문은, 왜 PHP 렉서는 너무 많은 플로트 식별 강조하고 을 던져 않습니다입니까?
처음에는 부정적인 담당자가 있었기 때문에 내가 무엇을 의미하는지 명확히하기 위해 질문을 편집했습니다. 내가
eval()
그게 전부가 변경됩니다. 문자열'1 '은 유효한 부동 소수점이 아니므로 – DarkBee
https://eval.in/646594 오류가 발생합니다.이'$ var + 1.'는 PHP에서 유형 변환으로 사용되며'.'가 누락되었습니다. 오류가 주어진다. –
나는 '$ var + 1'이 타입 변환으로 작동하고 그 파서가 "example"(문자열)을 얻고 나서 에러를 내고 있다고 말하려고했다. –