Функции и type hinting

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
NeverDie
Сообщения: 70
Зарегистрирован: 2012.05.13, 04:05
Откуда: Минск
Контактная информация:

Функции и type hinting

Сообщение NeverDie »

Здравствуйте.
Функция должна всегда возращать один тип данных?

Код: Выделить всё

function test() {
	$var = true;
	$errors = array();
	...
	return $var === true ? $var : $errors;
}
Приведу пример. Необходимо сохранить данные внутри модели, если пользователя нет. Или лучше всегда возвращать модель, а потом везде по коду таскать проверку на сохранение?

Код: Выделить всё

	class User {
		public function saveData($attributes) {
			... 
			$model = new static;
			$model->attributes = $attributes;
			return $model->save() ? $model->id : $model->getErrors();
		}
	}
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Функции и type hinting

Сообщение ElisDN »

1. Да, надёжней один тип данных или исключение:

Код: Выделить всё

function get(int $id): User {
    if (!$user = User::findOne($id)) {
        throw new EntityNotFoundException('User is not found.');
    }
    return $user;
}
2. Иногда можно один тип или null:

Код: Выделить всё

function find(int $id): ?User {
    return User::findOne($id);
}
Но тогда придётся добавить if ($user !== null) в вызывающий этот метод код.

3. В процедурах не возвращать true/false, а либо делать дело молча, либо кидать исключение:

Код: Выделить всё

function save(User $user): void {
    if (!$user->save()) {
        throw new ValidationException($user->getErrors());
    }
}
4. При желании из процедуры вернуть результат;

Код: Выделить всё

function create(array $attributes): User {
    $user = new User($attributes);
    if (!$user->save()) {
        throw new ValidationException($user->getErrors());
    }
    return $user;
}
Ответить