В PHP, какая цель делает (не задана)?

Нет, я не имею в виду конструкцию языка unset(), но заклинатель типа (unset). Из руководства PHP:

Разрешенные броски:

  • (int), (integer) - cast to integer
  • (bool), (boolean) - cast to boolean
  • (float), (double), (real) - cast to float
  • (строка) - строка в строке
  • (массив) - cast to array
  • (объект) - приведение к объекту
  • (unset) - отбрасывается в NULL (PHP 5)

URL: http://php.net/manual/en/language.types.type-juggling.php

Кто-нибудь имеет представление об этом (или даже использовал его в реальном проекте)?

Ответы

Ответ 1

Я даже не знал, что это что-то, но похоже, что цель - это просто полнота доступных php-примитивов (один из них - NULL). Обратите внимание, что это отличает данные.. он не пишет.

$x = 'foon';
$y = (unset)$x;
var_dump($x, $y) // 'foon', NULL

Обратите внимание, что x не null, несмотря на приведение.

Рядом, как я могу судить, нет оснований когда-либо использовать (unset)<anything>, а не просто писать null. Возможно, кто-то еще может придумать лучший ответ.

Ответ 2

Я использую (unset) casting, чтобы избежать создания уродливых операторов if else в ситуации, если вам нужно проверить и использовать многие переменные, но если одна переменная считается неправильной и вы не хотите проверять оставшиеся.

Например, у вас есть следующий код:

$variableone = "ffo";
$variabletwo = "obb";
$variablethree = "aar";

if(checkonefailed($variableone))
{
    outputsomething();
}
else
{
    dosomething($variableone)
    if(checktwofailed($variabletwo))
    {
        outputsomething();
    }
    else
    {
        dosomething($variabletwo)
        if(checkthreefailed($variablethree))
        {
            outputsomething();
        }
        else
        {
            dosomething($variablethree)
            //And so own
        }
    }
}

Вы можете переписать его следующим образом:

$variableone = "ffo";
$variabletwo = "obb";
$variablethree = "aar";

if(checkonefailed($variableone))
{
    outputsomething();
}
//False or check
elseif((unset)(dosomething($variableone))||(checktwofailed($variabletwo)))
{
    outputsomething();
}
elseif((unset)(dosomething($variabletwo))||(checkthreefailed($variablethree)))
{
    outputsomething();
}
elseif((unset)(dosomething($variablethree))/*or next variable*/)
{
  //And so own
}

Идея, взятая из кода программирования Go

if variableone := "ffo"; checkonefailed(variableone) {
    outputsomething()
} else if dosomething(variableone); variabletwo := "obb"; checktwofailed(variabletwo) {
    outputsomething()
} else if dosomething(variabletwo); variablethree := "aar"; checkthreefailed(variablethree) {
    outputsomething()
} else dosomething(variablethree)

Ответ 3

Единственное, что я могу придумать, - это какой-то будущий вариант использования, когда класс может определить, как работают операторы литья, например, с помощью __toString(). Класс потенциально может быть помечен как недействительный, и, следовательно, приведение к null приведет к исключению. Это было бы принципиально отличным от назначения NULL, хотя почему он назвал unset загадочным.

Ответ 4

Цель состоит в том, чтобы наложить на NULL, как вы уже писали в своем вопросе:

(unset) - cast to NULL (PHP 5)

Итак, скажем, у вас есть переменная $var, из которой isset($var) есть TRUE. Затем вы можете применить эту переменную к NULL:

/**
 * @param mixed $var anything
 */
function func($var)
{
    if (isset($var))
    {
        $var = (unset) $var;
    }
    # the rest of the code expects $var to be NULL
    ...
}

Конечно, $var = NULL будет делать то же самое здесь, но без литья.

Ответ 5

Согласно php.net:

Пример # 2 Использование (unset) casting

(unset) литье часто путается с функцией unset(). (Отключенное) литье служит только для отливки NULL, для полноты. Это не измените переменную, которую она отличает.

Итак, способ, которым я его читаю, - "Все типы являются допустимыми, null - это тип, поэтому для согласованности мы добавили приведение к null"