2017-02-15 29 views
0

Я купил тему Drupal, и поддержка ... отсутствует. Поэтому я подумал, что попытаюсь справиться с этим сам. Я относительно новичок в программировании на PHP, поэтому, пожалуйста, успокойтесь на мне :)Как правильно сравнить строку и целое число в PHP?

Ошибка, которую я получил: Примечание: объект класса Drupal \ Core \ Field \ FieldItemList не может быть преобразован в int в theme_css_alter ()

копания в заблуждение, он пришел из первой строки кода в этом случае утверждение:

if(isset($node->nid) && $node->nid == 90){ 
    //do stuff 
} 

Я сделал свое исследование и обнаружил, что его ошибка PHP при использовании оператора ==, скорее всего, так как $ node-> nid выбирается как строка, а 90 - целое число, и он не может конвертировать ник «на лету».

Возможные решения, которые я нашел, в то время как Googling либо создавал «getter» для получения низа как целого (что звучит сложнее, чем необходимо), используя оператор ===; и я догадываюсь сам по себе, что если я конвертирую 90 в строку, это также сработает?

Теперь, выполняя тестовый прогон, === останавливает отображение ошибки, но мои исследования показывают, что === работает только тогда, когда и значение, и тип равны, и дано. Я сравниваю строку и integer, я предполагаю, что он всегда будет просто ложным.

Итак ...

  1. Я правильно говорю, что в PHP 90 (в виде строки) не == 90 (как целое число)?
  2. Правильно ли я говорю, что использование === вместо == НЕ является правильным способом сравнения строки и целого числа?
  3. Был бы $ node-> nid == (string) 90 {был ли правильный способ сравнения для этого оператора if? Каков наиболее правильный способ сделать это сравнение?
+0

Сравнение строк с числами обычно делает то, что вы ожидаете. Сообщение об ошибке указывает, что '$ node-> nid' является' FieldItemList', а не строкой. – Barmar

+0

Спасибо, Бармар. Я предположил, что nid будет строкой, потому что это то, что обычно находится в другом месте, и что FieldItemList был всего лишь классом PHP в Drupal 8. Неужели это тоже не так? –

+0

У него может быть метод для преобразования в строку, поэтому вы можете использовать его там, где требуется строка, но на самом деле это не строка. – Barmar

ответ

0

Когда вы сравниваете число с чем-то другим, другая вещь сначала преобразуется в число, а затем сравниваются эти два числа. Поэтому сравнение, подобное "90" == 90, делает то, что вы ожидаете - это эквивалентно 90 == 90.

Проблема, с которой вы сталкиваетесь, заключается в том, что $node->nid не является строкой, это объект класса Drupal\Core\Field\FieldItemList. Класс не предоставляет метод преобразования этого типа в число, поэтому он не может выполнить сравнение.

Однако, похоже, что этот тип имеет метод преобразования в строку. Но при выполнении сравнения PHP не будет делать двойное преобразование. Поэтому вам нужно явно выполнить преобразование объекта-> строки, а затем PHP преобразует строку в целое.

if (isset($node->nid) && (string)$node->nid == 90) 
+0

Звучит правильно. Благодарю. Я предполагаю, что это больше делает Drupal, чем вещь PHP. Я новичок здесь, должен ли я изменить вопрос и открыть новый на drupal.stackexchange.com? –

+0

Я только что добавил решение. – Barmar

+0

Я отметил это как решение, так как он технически корректен с вопросами, которые я задал. К сожалению, FieldItemList не может быть преобразован в строку, но теперь я знаю, почему эта строка терпит неудачу, я могу сделать еще больше копания. (FYI, я думаю, что причина моей путаницы - это изменения между Drupal 7 и 8, я думаю, что D7 вы могли бы назвать это решением, которое вы предложили ...) –

0

Строка не будет равна целому числу. Вам также нужно проверить тип. Вот почему мы используем знак тройного равенства ===. Рассмотрим следующий код:

$integer = 90; 
$string = "90"; 

echo($integer == $string); // prints 1 (true) 
echo($integer === $string); // prints 0 (false) 

Вы можете проверить свои собственные переменные в this странице.

+0

Ваш код противоречит тому, что вы написали в ответе. Первый печатает true, показывая, что строка может быть равна целому числу, когда вы используете '=='. – Barmar

0

Barmar правильно указывает, почему это утверждение не выполняется; сравнение работает, но $ node-> nid не является строкой или целым числом. Я добавляю этот ответ в качестве дополнительной справки для Drupal.

В ссылке: https://drupal.stackexchange.com/questions/145823/how-do-i-get-the-current-node-id

Drupal 8 изменила способ доступа NID значения. В конечном счете, причина в том, что при попытке доступа к этому параметру повышается до полного объекта узла, поэтому его ни строка, ни целое.

Правильный способ сравнения состоит в использовании значения $ node-> nid-> или $ node-> id(). Альтернативные способы получения идентификатора в качестве значения указаны в ссылке.