arrays — Пустые и NULL одинаковы в операции сравнения в PHP?

У меня есть класс, который имеет метод, который ожидает ответа от службы API в формате массива. Затем этот метод преобразует массив ответа в объект путем приведения (object)$response_array, После этого метод пытается разобрать содержимое объекта. Существует вероятность, что возвращаемый массив может быть пустым. Перед анализом содержимого объекта в моем методе класса я выполняю проверку на наличие нулевого или пустого объекта в if...else блок. Я хотел бы использовать оператор сравнения эквивалентности, как if($response_object === null){} и не if(empty($response_object)){},
Вот как выглядит мой класс

<?php
class ApiCall {

//this method receives array response, converts to object and then parses object
public function parseResponse(array $response_array)
{
$response_object = (object)$response_array;

//check if this object is null
if($response_object === null) //array with empty content returned
{
#...do something

}
else //returned array has content
{
#...do something

}

}

}
?>

Итак, мой вопрос — это правильный способ проверки на пустой объект, без использования функции empty() и это соответствует? Если нет, то как я могу изменить этот код, чтобы получить согласованные результаты. Это поможет мне знать, если null а также empty означает то же самое в PHP-объектах. Я был бы признателен за любой ответ, где я все еще могу использовать эквивалентное сравнение, как это ===

1

Решение

Это не правильный способ проверить наличие пустого объекта. Если вы вызываете свою функцию parseResponse с пустым массивом, if условие все равно будет ложным.

Итак, если бы вы положили echo в if-else код как это:

class ApiCall {
//this method receives array response, converts to object and then parses object
public function parseResponse(array $response_array)
{
$response_object = (object)$response_array;
//check if this object is null
if($response_object === null) { // not doing what you expect
echo "null";
}
else {
echo "not null";
}
}
}

Тогда этот звонок:

ApiCall::parseResponse(array()); // call with empty array

… будет выводить

ненулевой

То же самое происходит, если вы проверяете empty($response_object), Раньше в прошлом это было иначе, но, начиная с PHP 5.0 (середина 2004 года), объекты без свойств больше не считаются пустыми.

Вы должны просто протестировать на массиве, который у вас уже есть, что ложно, когда пусто. Так что вы можете просто написать:

        if(!$response_array) {
echo "null";
}
else {
echo "not null";
}

Или, если вы действительно хотите (в) равенство, то сделайте $response_array == false, убедившись, что использовать == и не ===, Но лично я нахожу такие сравнения с логическими литералами не более чем пустой тратой пространства.

Все последующее будет рабочими альтернативами для if состояние:

На основе $ response_array:

!$response_array
!count($response_array)
count($response_array) === 0
empty($response_array)

На основе $ response_object:

!get_object_vars($response_object)
!(array)($response_object)

Обратите внимание, что get_object_vars может дать другой результат, чем метод приведения массива, если $ response_object не были стандартным объектом и имели бы унаследованные свойства.

2

Другие решения

Посмотрите на этот пример

$ php -a
php > $o = (object)null;
php > var_dump($o);
class stdClass#2 (0) {
}
php > var_dump(!$o);
bool(false)

Так что не стоит сравнивать объект с нулем в вашем случае. Подробнее об этом: Как проверить, что объект пуст в PHP?

1

По вопросам рекламы [email protected]