@springimport

Как решить проблему возвращаемых объектов?

Нужно вывести имя клиента платежа. Возьмем такой пример:
class Payment
{
    /**
     * @var Customer|null
     */
    protected $customer;
    
    public function getCustomer()
    {
        return $this->customer;
    }
    
    public function setCustomer(Customer $customer)
    {
        $this->customer = $customer;
    }
}

class Customer
{
    public function getFirstname()
    {
        return 'Name';
    }
}

/** @var Payment $payment */
echo $payment->getCustomer()->getFirstname();

Как вы могли догадаться, бывает так что клиента в платеже нет. Был удален, например. В этом случае возникнет ошибка потому что обращение к null.
Можно создать метод с проверкой (или просто условие):
public function printCustomerFirstname(Payment $payment)
{
    if ($payment->getCustomer()) {
        echo $payment->getCustomer()->getFirstname();
    }
}

/** @var Payment $payment */
printCustomerFirstname($payment);


Но как бы это решил "синьер"?
Возможно что в 2018 уже выработался какой-то best practice.
  • Вопрос задан
  • 129 просмотров
Пригласить эксперта
Ответы на вопрос 5
@Arik
1.
class Payment
{
    //...
    public function getCustomerFirstname()
    {
        return $this->customer ? $this->customer->firstname : null;
    }
}


2.
echo ($c = $payment->getCustomer()) ? $c->getFirstname() : '[удален]';
Ответ написан
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
Не стоит применять слишком много "магии" или заглушек, а то в итоге станет проблематично понять где именно данных нет, а где просто пустое значение.
Ответ написан
@grinat
Ошибки нельзя глушить. Ставь try catch если это не критичная ошибка и лови исключение. Либо проверяй что не нул.
Ответ написан
ObjectHelper::getValue($payment,'customer.firstname',$defaultValue);

А внутри getValue реализовать проверку существования свойства, если его нет, то выдаем $defaultValue
Ответ написан
dmitriylanets
@dmitriylanets
веб-разработчик
1.
Как вы могли догадаться, бывает так что клиента в платеже нет. Был удален, например.

нельзя удалить связанные сущности просто так, вы можете пометить клиента как удаленный но удалять не рекомендовал, бы дабы не плодить кучу проверок
2.
public function printCustomerFirstname(Payment $payment)
{
    if ($payment->getCustomer()) {
        echo $payment->getCustomer()->getFirstname();
    }
}

echo в методе в 2018 - неприлично

3. Проверка решается выбросом исключения
public function getCustomerFirstname(): string
{
    if(!$this->getCustomer()){
       throw new \Exceptions\CustomerNotFound;
    }
    return $this->getCustomer()->getFirstname();
}

try{
$customerName = $payment->getCustomerFirstname();
}
catch( \Exceptions\CustomerNotFound $ex){
$customerName = null;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы