Пример #1
0
/**
 * Раньше функция @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);
}
Пример #2
0
/**
 * 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);
}
Пример #3
0
/**
* 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;
}
Пример #4
0
/**
 * Осуществляет ленивое ветвление.
 * @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);
}
Пример #5
0
/**
 * 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);
}