/** * Раньше функция @see dfa() была универсальной: * она принимала в качестве аргумента $entity как массивы, так и объекты. * В 99.9% случаев в качестве параметра передавался массив. * Поэтому ради ускорения работы системы * вынес обработку объектов в отдельную функцию @see dfo() * @param mixed[]|array(string => int[]) $array * @param string|int $key * @param mixed|callable $default * @return mixed|null */ function dfa(array $array, $key, $default = null) { /** * 2016-02-13 * Нельзя здесь писать return df_if2(isset($array[$key]), $array[$key], $default); * потому что получим «Notice: Undefined index». * * 2016-08-07 * В @see \Closure мы можем безнаказанно передавать параметры, * даже если closure их не поддерживает https://3v4l.org/9Sf7n */ return isset($array[$key]) ? $array[$key] : df_call_if($default, $key); }
/** * 2016-08-23 * @see dfa() * @param object $object * @param string|int $key * @param mixed|callable $default * @return mixed|null */ function dfo($object, $key, $default = null) { return isset($object->{$key}) ? $object->{$key} : df_call_if($default, $key); }
/** * 2015-02-27 * Обратите внимание на разницу между @see \SimpleXMLElement::asXML() * и @see \SimpleXMLElement::__toString() / оператор (string)$this. * * @see \SimpleXMLElement::__toString() и (string)$this * возвращают непустую строку только для концевых узлов (листьев дерева XML). * Пример: <?xml version='1.0' encoding='utf-8'?> <menu> <product> <cms> <class>aaa</class> <weight>1</weight> </cms> <test> <class>bbb</class> <weight>2</weight> </test> </product> </menu> * Здесь для $e1 = $xml->{'product'}->{'cms'}->{'class'} * мы можем использовать $e1->__toString() и (string)$e1. * http://3v4l.org/rAq3F * Однако для $e2 = $xml->{'product'}->{'cms'} * мы не можем использовать $e2->__toString() и (string)$e2, * потому что узел «cms» не является концевым узлом (листом дерева XML). * http://3v4l.org/Pkj37 * Более того, метод @see \SimpleXMLElement::__toString() * отсутствует в PHP версий 5.2.17 и ниже: * http://3v4l.org/Wiia2#v500 * * 2015-03-02 * Обратите внимание, * то мы специально допускаем возможность для первого параметра $e принимать значение null: * это даёт нам возможность писать код типа: * @used-by Df_Page_Helper_Head::needSkipAsStandardCss() df_leaf_b(df_config_node( 'df/page/skip_standard_css/', df_state()->getController()->getFullActionName() )) * без дополнительных проверок, имеется ли в наличии запрашиваемый лист дерева XML * (если лист отсутствует, то @see df_config_node() вернёт null) * * @param CX|null $e [optional] * @param string|null|callable $default [optional] * @return string|null */ function df_leaf(CX $e = null, $default = null) { /** @var string $result */ /** * 2015-08-04 * Нельзя здесь использовать !$e, * потому что для концевых текстовых узлов с ненулевым целым значением (например: «147») * такое выражение довольно-таки неожиданно возвращает true. * @see \SimpleXMLElement вообще необычный класс с нестандартным поведением. * Чтобы понять, почему в данном случае !$e равно true, посморите функцию @see df_xml_exists() * * Так вот, @see df_xml_exists() для текстового узла всегда возвращает false, * даже если текстовое значение не приводится к false (то же «147»). * * Почему так происходит — видно из реализации @see df_xml_exists(): !empty($e) * То есть, empty($e) для текстовых узлов возвращает true. * * Например: <Остаток> <Склад> <Ид>6f87e83f-722c-11df-b336-0011955cba6b</Ид> <Количество>147</Количество> </Склад> </Остаток> * Если здесь сделать xpath Остаток/Склад/Количество, * то для узла «147» !$e почему-то вернёт true, * хотя в данном случае $e является полноценным объектом @see \SimpleXMLElement * и (string)$e возвращает «147». */ if (is_null($e)) { $result = df_call_if($default); } else { df_assert_leaf($e); $result = (string) $e; if (df_empty_string($result)) { /** * 2015-09-25 * Добавил данное условие, чтобы различать случай пустого узла и отсутствия узла. * Пример пустого узла ru_RU: * <term> * <en_US>Order Total</en_US> * <ru_RU></ru_RU> * </term> * Так вот, для пустого узла empty($e) вернёт false, * а для отсутствующего узла — true. */ $result = df_if1(empty($e), $default, ''); } } return $result; }
/** * Осуществляет ленивое ветвление. * @param bool $condition * @param mixed|callable $onTrue * @param mixed|null|callable $onFalse [optional] * @return mixed */ function df_if($condition, $onTrue, $onFalse = null) { return $condition ? df_call_if($onTrue) : df_call_if($onFalse); }
/** * 2016-08-04 * 2016-08-10 * @uses defined() не реагирует на методы класса, в том числе на статические, * поэтому нам использовать эту функию безопасно: https://3v4l.org/9RBfr * @used-by \Df\Config\O::ct() * @used-by \Df\Payment\Method::codeS() * @param string|object $c * @param string $name * @param mixed|callable $def [optional] * @return mixed */ function df_const($c, $name, $def = null) { /** @var string $nameFull */ $nameFull = df_cts($c) . '::' . $name; return defined($nameFull) ? constant($nameFull) : df_call_if($def); }