У меня есть класс, который имеет метод, который ожидает ответа от службы 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-объектах. Я был бы признателен за любой ответ, где я все еще могу использовать эквивалентное сравнение, как это ===
Это не правильный способ проверить наличие пустого объекта. Если вы вызываете свою функцию 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 не были стандартным объектом и имели бы унаследованные свойства.
Посмотрите на этот пример
$ php -a
php > $o = (object)null;
php > var_dump($o);
class stdClass#2 (0) {
}
php > var_dump(!$o);
bool(false)
Так что не стоит сравнивать объект с нулем в вашем случае. Подробнее об этом: Как проверить, что объект пуст в PHP?