Уже есть много вопросов по подсказке возвращаемого типа PHP 7 и почему невозможно вернуть null, если класс был определен как возвращаемый тип. Как этот: Правильный способ обработки возвращаемых типов PHP 7 . В ответах обычно говорится, что это не проблема, поскольку если функция должна возвращать класс, то возврат null, вероятно, в любом случае является исключением. Может быть, я что-то упустил, но я не очень понимаю, почему. Например, давайте посмотрим на простой пользовательский класс:
class User
{
private $username; // mandatory
private $password; // mandatory
private $realName; // optional
private $address; // optional
public function getUsername() : string {
return $this->username;
}
public function setUsername(string $username) {
$this->username = $username;
}
public function getPassword() : string {
return $this->password;
}
public function setPassword(string $password) {
$this->password = $password;
}
public function getRealName() : string {
return $this->realName;
}
public function setRealName(string $realName = null) {
$this->realName = $realName;
}
public function getAddress() : Address {
return $this->address;
}
public function setAddress(Address $address = null) {
$this->address = $address;
}
}
В нашем приложении абсолютно законно иметь пользователя без реального имени и/или без адреса. Я даже могу установить для полей realName и address значение null, даже если приведенное выше решение не является оптимальным. И на нашей странице профиля я хочу отображать подсказку, если адрес нулевой (пустой).
Но это только 1 пример. Наше приложение имеет более 100 таблиц базы данных и соответствующих классов PHP, и почти все они имеют необязательные поля. Всегда писать блок try catch вместо простой проверки null для обработки необязательных полей кажется мне немного неоптимальным.
Итак, что является хорошим решением для приведенного выше примера?
getRealName()
, когда$this->realName
имеет значение null? Нужно ли проверять значение и обрабатывать его, если оно равно нулю? Если это так: ваш класс должен это делать. Если вы используете то, что нулевые строки обрабатываются как пустые строки для многих строковых операций, вам, вероятно, следует по умолчанию использовать пустую строку, а не нуль. Большинство ситуаций можно разрешить таким образом. Тем не менее, я думаю, что PHP неуместно придерживается этого мнения. - person Adam Cameron   schedule 11.04.2016Address::empty()
, чтобы указать пустой адрес вместо использования null. Хотя лично я бы не стал указывать необязательные поля. - person apokryfos   schedule 11.04.2016