Ошибка строкового выражения PHP: что здесь происходит? - PullRequest
2 голосов
/ 23 июня 2019

Выражение

"a".(strlen('ab')-strlen('a')) 

оценивается как a1, как и ожидалось.

Но если я случайно опущу скобки,

"a".strlen('ab')-strlen('a') 

оценивается как -1. Что здесь происходит?

Ответы [ 3 ]

3 голосов
/ 23 июня 2019

"a".strlen('ab')-strlen('a') обрабатывается слева направо следующим образом:

  • "a".strlen('ab') становится строкой"a2"

  • Теперь у вас есть 'a2' - 1

Вы не можете вычесть из строки, поэтому string 'a2' преобразуется в int , таким образом становясь0

  • Теперь у вас есть 0 - 1, что составляет -1.

Статьи по теме: приоритет операторов преобразования строк .

2 голосов
/ 23 июня 2019

Полагаю, вы также можете получить предупреждение о нечисловом значении, если опустить "()".

Как нормальное математическое правило, скобки решаются первыми, поэтому в

"a".(strlen('ab')-strlen('a'))

strlen('ab') равно 2 и, strlen('a') равно 1, таким образом, 2-1 = 1, и это конкрементно с 'a', таким образом, становится 'a1'.

А когда вы уберете скобки,

"a".strlen('ab')-strlen('a') 

затем выполняется слева направо, так что

  1. strlen('ab') concate с 'a', который дает a2
  2. затем 'a2', который не является числовым, вычитается с strlen('a'), который равен 1., поэтому отображается предупреждение.
  3. Но 'a2' вынужден быть преобразован в числовое значение, таким образом, становится 0, так что наконец
  4. 0 - 1 = -1
0 голосов
/ 23 июня 2019

The

"a".(strlen('ab')-strlen('a'))
Операция

сначала вычисляет разницу длины строк, а затем добавляет результат к "a", преобразовывая 1 в "1" в процессе.

The

"a".strlen('ab')-strlen('a') 
Операция

добавляет длину 'ab' (2) к "a", в результате получается "a2". После этого из этой строки вычитается длина "a" (1), но поскольку вычитание может происходить только между числами в PHP, следовательно, "a2", преобразованное в 0 и вычитающее 1 отсюда, дает -1 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...