Сделайте функцию, возвращающую и 0 и истину - PullRequest
0 голосов
/ 01 июля 2010

Возможно ли это? Я вижу, что некоторые нативные функции PHP могут сделать это. Например: strpos() может вернуть 0, что, по-видимому, может быть истинным.

Ответы [ 7 ]

8 голосов
/ 01 июля 2010

Редактировать

Когда руководство говорит, что некоторая функция может возвращать как целое число 0, так и логическое значение false, это означает, что она может вернуть либо целое число 0, либо логическое значение false (не оба) в любом заданном вызове. PHP не является строго типизированным, функции могут возвращать разные типы в разных ситуациях. Например, следующая функция возвращает либо 0, либо false, в зависимости от того, является ли переданный параметр неотрицательным или нет:

function myfunc($arg) {
    if ($arg >= 0)
        return 0;
    else
        return false;
}

Оригинал

PHP не имеет многократного возврата. У вас есть два варианта:

Вместо этого возвращать составные значения

function myfunc() {
    return array(0, true); //return array
}

class MyOutputHolder {
    private $number;
    private $truth;
    function getNumber { return $this->number; }
    function getTruth { return $this->truth; }
    function __construct($number, $truth) {
        $this->number = $number;
        $this->truth = $truth;
    }
}
function myfunc() {
    return new MyOutputHolder(0, true); //return object
}

Третья возможность - пользовательский ресурс, но он должен быть реализован внутри (в расширении).

Использовать выходные параметры

function myfunc(&$outnumber, &$outtruth) {
    $outnumber = 0;
    $outtruth = true;
}

Конечно, вы можете вернуть только 0 или true и использовать только один параметр.

4 голосов
/ 01 июля 2010

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

if(somefunction() !== false) {



}

Целое ноль интерпретируется как ложное, если тип не рассматривается.Например, если предположить, что somefunction возвращает ноль.

somefunction() != false

Будет ложным, а

somefunction() !== false

будет истинным.

3 голосов
/ 01 июля 2010

Ваша путаница заключается в том, что strpos возвращает нулевой индекс строки поиска .

Таким образом, в этом случае 0 является верным возвращением, это означает «нашел его по индексу 0»

Если строка вообще не найдена, она возвращает FALSE.

Важно отметить, что написано большим красным предупреждением на странице документа strpos:

Эта функция может возвращать логическое значение ЛОЖЬ, но может также вернуть небулево значение, которое оценивается как ЛОЖЬ, например 0 или "". Пожалуйста, прочитайте раздел о логических значениях для более Информация. Используйте оператор === для тестирование возвращаемого значения этого функция.

то есть: 0 не совсем ЛОЖЬ в php. Это основа php. 0 == ЛОЖЬ, но 0! == ЛОЖЬ

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

2 голосов
/ 01 июля 2010

Это считается?

function stupid() { 
   return "0\0"; 
}; 

echo stupid() ."\n"; 

var_dump(stupid()); 

if (stupid()) echo "true\n"; 

echo stupid() + 4 . "\n";

Выход:

0
string(2) "0"
true
4

* утки *

0 голосов
/ 01 июля 2010

Я думаю, вы не понимаете, что на самом деле возвращает strpos ...

strpos () возвращает либо целое число, большее или равное нулю, либо возвращает false (если символ стрелки не найден вstring).

0 не равно true в каком-либо смысле - хотя в документации PHP упоминается, что из-за свободной типизации PHP 0 может равняться false, если вы не используете условный оператор, который принудительно вводит тип кака также сравнение значений.

var_dump(0 == false);  // 'true'
var_dump(0 == true);   // 'false'
var_dump(0 === false); // 'false'
var_dump(0 === true);  // 'false'
var_dump(0 !== false); // 'true'

именно поэтому руководство по PHP рекомендует проверять возвращаемое значение из strpos () с помощью '! == false', поскольку искомый символ может быть первым символом встрока и, следовательно, функция возвращает 0.

$string = "_testing";
var_dump(strpos($string, '_'));           // 0
var_dump(strpos($string, '_') !== false); // 'true'
var_dump(strpos($string, '_') === true);  // 'false'
0 голосов
/ 01 июля 2010
return 0 && true;
0 голосов
/ 01 июля 2010

Функция может иметь только одно возвращаемое значение. Однако вы можете вернуть массив с несколькими значениями, если вам нужно.

...