2013-05-03 5 views
1

Я совершенно смущен: почему мой метод работы не работает?Проверка логического состояния после возврата логического значения из функции

У меня есть небольшая проблема, я не уверен, откуда она исходит, но я бы хотел сначала проверить, являются ли мои операторы IF причиной, но в java if(var){ //var is true } работает, но на PHP это кажется более сложнее, чем мое понимание булевых.

Я пытаюсь проверить, является ли логическое значение true после получения return true; функции, которую я использовал при проверке.

Некоторые из моих кодов таковы.

IF: if($user->userValidMC($_POST['username']) === true ФУНКЦИЯ:

public function userValidMC($user){ 

     // grab data 
     $minecraftOutput = file_get_contents('https://www.minecraft.net/haspaid.jsp?user=' . $user . ''); 

     return $minecraftOutput; 

    } 

Могу ли я проверить что-то не так, или мой код совершенно неправильно (функция)?

+0

ли URL в вашем примере _really_ возвращает значение PHP «истинный» или он возвращается в _string_ правда? – akluth

+0

Вы проверяете, имеет ли строка тип bool и установлено значение true, а какие строки отсутствуют. – Daniel

+0

Кажется, вы не возвращаете 'true' из своей функции. – Rikesh

ответ

2

Удаленная служба возвращает строку, либо 'true' или 'false', так возвращаемое значение должно быть:

return trim($minecraftOutput) === 'true'; 
+0

+1: это было решение, которое я искал! –

+0

Мысль о том, что file_get_contents не удастся из-за ошибки 404. Давайте посмотрим, что говорит OP – hek2mgl

+0

@ hek2mgl Нет, он возвращает '(string) false', видимо, поэтому было разумно предположить, что это будет' (string) true' при успехе :) –

0

Вы возвращаете результаты file_get_contents.
То, что содержит содержимое файла, а не логическое значение.
Я предлагаю вам проверить, существует ли файл, а затем посмотреть, есть ли длина содержимого.

+0

При сбое file_get_contents() вернет FALSE. – sbeliv01

+0

Так оно и есть. Спасибо за эту заметку. –

3

Метод фактически вернет строку. (Протестировали с this URL) Изменение if на:

if($user->userValidMC($_POST['username']) !== 'false' 

Это происходит потому, что если пользователь существует, метод возвращает содержимое страницы, а не логическое true. Но вы тестируете === true. Но если пользователь не существует, метод вернет false, так как file_get_contents() не работает. Поэтому вы должны это проверить.

Другой способ - который я предпочел бы - это изменить способ:

public function userValidMC($user){ 
    // grab data 
    // the page will return the string 'false' if the user does not exist 
    $minecraftOutput = file_get_contents('https://www.minecraft.net/haspaid.jsp?user=' . $user . ''); 
    return $minecraftOutput !== 'false'; 
} 

... и (оригинал) if заявление:

if($user->userValidMC($_POST['username']) === true 
+0

+1: Хотя я затвору, когда вижу это, я понимаю, что работа вокруг ''file_get_contents' будет последовательно возвращать значение' bool' 'false' при ошибке, но ничто другое не будет согласовано! –

+0

@MichaelPerrenoud Да, если url вернет 404, 'file_get_contents()' вернет 'bool (false)' – hek2mgl

+0

Спасибо, это, похоже, работало вместе с ответом Джека. Позор Я не могу отметить два ответа в качестве решения! – Lewes

0

file_get_contents будет возвращать либо содержимое файла или false.

Использование тройные = средство сравнения значения и тип, так что вы говорите, если функция возвращает логическое значение TRUE, в котором он не будет,

0

Условный вы вывесили проверки кастрированный баран функции «userValidMC» вернулся так, обратите внимание, что вы используете ===, так что вы проверяете для фактического «истинного» значения логического и а не только значение оценивается как true (используя ==).

if($user->userValidMC($_POST['username']) === true) 

Однако, эта функция возвращает результат file_get_contents (http://php.net/manual/en/function.file-get-contents.php)

Эта функция возвращает содержимое файла или ложным в случае неудачи, поэтому он никогда не должен возвращать верно.

Вы можете проверить результат таким образом:

if($user->userValidMC($_POST['username']) !== false) 
0

The 'file_get_contents' возвращает строку на успех и ложь в противном случае.

Если вы просто проверка, что вы получите правильный ответ от вызова, то:

return $minecraftOutput !== false; 

будет возвращать логическое значение.

Или, если вы проверяете для конкретного значения в ответ, то:

return $minecraftOutput === "expectedValue"; 

Если вы хотите быть менее строгим, то:

if($user->userValidMC($_POST['username']) == true) 

Пройдут (большинство) строк с длина больше 0, но возврат строгой логической величины из вашей функции является более безопасным.

См: PHP type comparisons

Смежные вопросы