У меня есть такая вещь, что даже с PHP мне нравится находить функциональные решения. Так, например, ответ, данный @migli, действительно хороший, очень гибкий и элегантный.
Но есть проблема: что, если вам нужно проверить множество строк DateTime в одном и том же формате? Вам придется повторить формат повсеместно, что противоречит принципу СУХОЙ . Мы могли бы поместить формат в константу, но, тем не менее, нам пришлось бы передавать константу в качестве аргумента для каждого вызова функции.
Но не бойся больше! Мы можем использовать карри для нашего спасения! PHP не делает эту задачу приятной, но все еще возможно реализовать карри с помощью PHP:
<?php
function validateDateTime($format)
{
return function($dateStr) use ($format) {
$date = DateTime::createFromFormat($format, $dateStr);
return $date && $date->format($format) === $dateStr;
};
}
Итак, что мы только что сделали? По сути, мы обернули тело функции в анонимный и вместо этого вернули такую функцию. Мы можем вызвать функцию проверки так:
validateDateTime('Y-m-d H:i:s')('2017-02-06 17:07:11'); // true
Да, не большая разница ... но настоящая сила исходит от частично примененной функции , которая стала возможной благодаря карри:
// Get a partially applied function
$validate = validateDateTime('Y-m-d H:i:s');
// Now you can use it everywhere, without repeating the format!
$validate('2017-02-06 17:09:31'); // true
$validate('1999-03-31 07:07:07'); // true
$validate('13-2-4 3:2:45'); // false
Функциональное программирование FTW!