тернарный оператор в php устанавливает переменную неправильно, если нет скобок [duplicate]

Немного поздно знаю, но ответ - нет.

Даже если вы пишете на C и компилируете собственный код, есть dissasemblers / debuggers, которые позволят людям пройти через ваш код. Предоставлено - отладка оптимизированного кода без символической информации - боль, но это может быть сделано, мне приходилось иногда это делать.

Есть шаги, которые вы можете предпринять, чтобы сделать это сложнее - например, на окнах вы можете вызвать API IsDebuggerPresent в цикле, чтобы узнать, отлаживает ли кто-то ваш процесс, и если да, и это релиз-сборка - завершите процесс. Конечно, достаточно решительный атакующий может перехватить ваш вызов IsDebuggerPresent и всегда возвращать false.

Существует целый ряд методов, которые появились - люди, которые хотят что-то защитить, и люди, которые хотят взломать его широко, это настоящая гонка вооружений! После того, как вы пойдете по этому пути, вам придется постоянно обновлять / модернизировать свою защиту, нет остановки.

44
задан Cesar 23 August 2009 в 01:49
поделиться

3 ответа

$description = 'Paper: ' . ($paperType == 'bond' ? 'Bond' : 'Other');

Попробуйте добавить круглые скобки, чтобы строка была объединена со строкой в ​​правильном порядке.

84
ответ дан meder omuraliev 19 August 2018 в 13:24
поделиться
  • 1
    Да, это работает, так это проблема приоритета оператора в моем коде, стыдно за меня; ~) – Cesar 23 August 2009 в 01:10
  • 2
    Но я не совсем понимаю, что происходит ... – Cesar 23 August 2009 в 01:12
  • 3
    'Бумага:' сначала применяется к логическому (результат $ paperType == 'bond'), другими словами код не происходит в правильном порядке. – meder omuraliev 23 August 2009 в 01:18
  • 4
    И чтобы разрешить это, указав круглые скобки, о которых вы в основном говорите, верните либо «Бонд», либо «Другое», а затем добавьте его в «Бумага»: «ВМЕСТО» пытается добавить «Бумага»: true или false. – meder omuraliev 23 August 2009 в 01:20
  • 5
    Да, это правильно, и это происходит потому, что "." оператор имеет приоритет над "?:" оператор. – João Silva 23 August 2009 в 01:51

Я думаю, что все дали решение, я хотел бы объяснить причину неожиданного результата.

Прежде всего, здесь вы можете проверить происхождение и как оцениваются операторы (слева, справа, ассоциативный и т. д.).

http://php.net/manual/fa/language.operators.precedence.php

Теперь, если мы проанализируем ваши предложение.

$ paperType = 'bond';
$ description = 'Paper:'. ($ paperType == 'bond')? 'Bond': 'Other';

1) Мы рассмотрим таблицу и выясним, что скобки сначала оцениваются, а затем. (конкатенация), а в конце - тернарный оператор '?', поэтому мы могли бы связать это следующим образом:

// evaluate the parenthesis ... ($ paperType == 'bond')
$ description = ('Paper:'. 1)? 'Bond': 'Other';
//result
$ description = 'Paper: 1'? 'Bond': 'Other';

2) Теперь мы имеем тернарный оператор, мы знаем, что строка оценивается «true»

// php documentation При преобразовании в логическое значение следующие значения считаются FALSE:

... пустая строка и строка «0»

$ description = true? 'Bond': 'Other';

3) Наконец

$ description = 'bond';

Надеюсь, что я уточнил этот вопрос. Привет.

1
ответ дан Hizmarck 19 August 2018 в 13:24
поделиться

Это связано с приоритетом оператора. Вы должны сделать следующее:

$description = 'Paper: ' . (($paperType == 'bond') ? 'Bond' : 'Other');
9
ответ дан João Silva 19 August 2018 в 13:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: