PHP - Как использовать isset в функции класса, а не при вызове функции - PullRequest
1 голос
/ 04 мая 2020

Я использую вывод API. Извлеченные данные обрабатываются в одном из моих классов. Вывод похож на это:

stdClass Object
(
   [status] => error
    [redirect_url] => stdClass Object
        (
            [web] => https://example.com/signup.php
        )
)

Я использую выше в своем классе $siteItems->processData($output->status, $output->answer);

Однако, когда данные недоступны, я получаю Trying to get property 'answer' of non-object. Когда я использую isset и получаю неверный запрос $siteItems->processData(isset($output->status), isset($output->answer)) я не получаю это.

Есть ли способ использовать $ siteItems-> processData ($ output-> status, $ output-> answer) и использовать только isset внутри моего собственного класса вместо того, чтобы использовать его при вызове функции.

Ответы [ 3 ]

1 голос
/ 04 мая 2020

Если processData() находится в вашем собственном классе, так что вы можете изменить реализацию, почему бы просто не передать объект вместо свойств ...

$siteItems->processData($output);

и в вашем классе, где processData() определено, используйте троичный оператор , чтобы установить переменную или ноль в противном случае. Затем вы можете проверить их в if и выполнить действия в зависимости от того, существуют они или нет:

public function processData($obj) {
  $status = (!is_null($obj->status)) ? $obj->status: null;
  $answer = (!is_null($obj->answer)) ? $obj->answer : null;

  if($status != 'error' && $answer) {
    // do stuff
  }
}
0 голосов
/ 04 мая 2020

Вы можете использовать оператор объединения нулей (PHP / 7.0 +):

<?php

$data = json_decode('{
    "one": {
        "two": [
            {
                "three": "Hello, World!"
            }
        ]
    }
}');
$foo = $data->one->two[0]->three ?? '(not set)';
var_dump($data, $foo);

$data = null;
$foo = $data->one->two[0]->three ?? '(not set)';
var_dump($data, $foo);

( демо )

0 голосов
/ 04 мая 2020

Я могу только предположить, что вы не получаете переменную «answer», потому что API возвращает ошибку состояния. В этом случае вам просто нужно проверить статус API.

$answer = $output->status === "error" ? "" : $output->answer;
$siteItems->processData($output->status, $answer);

Вы также можете проверить, существует ли свойство ответа

$answer = $output->status !== "error" && isset($output->answer)  ? $output->answer : "";
$siteItems->processData($output->status, $answer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...