Страница 1 из 1

Функции и type hinting

Добавлено: 2018.11.03, 11:26
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();
		}
	}

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

Добавлено: 2018.11.03, 18:18
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;
}