/** * 2016-08-04 * 2016-11-25 * Отныне метод возвращает класс не обязательно из базовой папки (например, \Df\Sso\Settings), * а из папки с тем же окончанием, что и у вызываемого класса. * Например, \Df\Sso\Settings\Button::convention() будет искать класс в папке Settings\Button * модуля, к которому относится класс $c. * @param object|string $c * @param string $key [optional] * @param null|string|int|S $scope [optional] * @param mixed|callable $d [optional] * @return self */ public static function convention($c, $key = '', $scope = null, $d = null) { /** @var self $result */ /** * 2016-11-25 * Используем 2 уровня кэширования, и оба они важны: * 1) Кэширование self::s() приводит к тому, что вызов s() непосредственно для класса * возвращает тот же объект, что и вызов convention(). Это очень важно. * 2) Кэширование dfcf() позволяет нам не рассчитывать df_con_heir() * при каждом вызове convention(). */ $result = dfcf(function ($c, $def) { return self::s(df_con_heir($c, $def)); }, [df_cts($c), static::class]); return df_null_or_empty_string($key) ? $result : $result->v($key, $scope, $d); }
/** * 2016-11-24 * 2016-11-27 * Не помечаем метод как final, потому что потомки уточняют его тип посредством phpDoc, * и тогда IntelliJ IDEA ругается на final. * @return S */ protected function s() { return dfc($this, function () { return df_ic(df_con_heir($this, S::class), [S::PREFIX => $this['dfConfigPrefix']]); }); }
/** * 2016-06-04 * 2016-12-01 * @see \Dfe\AmazonLogin\Customer * @see \Dfe\FacebookLogin\Customer * Не объявляем этот метод как final, потому что классы * @see \Dfe\FacebookLogin\Controller\Index\Index * @see \Dfe\AmazonLogin\Controller\Index\Index * уточняют класс его резульата посредством PHPDoc. * @return Customer */ protected function c() { return dfc($this, function () { /** @var Customer $result */ $result = df_create(df_con_heir($this, Customer::class)); $result->validate(); return $result; }); }