Нулевой против Ложного против 0 в PHP

Удалить @ из использования (Html.BeginForm ... здесь не требуется @, @ требуется, только если какое-либо условие в теге div

    @if (User.Identity.IsAuthenticated)
{
    if (User.IsInRole("Admin"))
    {

        <h4>Create a new document</h4>
            using (Html.BeginForm("Create", "Document", null, FormMethod.Post, new { enctype = "multipart/form-data" }))
            {
                @Html.AntiForgeryToken()

                <span>SOME HTML COD</span>
            }
    }
    else
    { <span>Vous devez être administrateur pour accéder à cette section</span>}
}
else
{<span>Vous devez être connecté pour accéder à cette section</span>}
144
задан Ben 23 January 2015 в 16:08
поделиться

13 ответов

Это - конкретный язык, но в PHP:

Null "ничего" не означает. Var не был инициализирован.

False означает "не верный в булевом контексте". Используемый, чтобы явно показать Вам занимаются логическими проблемами.

0 int. Ничто, чтобы сделать с остальными выше, используемый для математики.

Теперь, что хитро, случается так, что на динамических языках как PHP, у всех них есть значение в булевом контексте, который (в PHP) является False.

Если Вы тестируете его с ==, это тестирует булево значение, таким образом, Вы получите равенство. Если Вы тестируете его с ===, это протестирует тип, и Вы получите неравенство.

Итак, почему они полезны?

Ну, посмотрите на strrpos() функция. Это возвращает False, если это не сделало нашел что-либо, но 0, если это нашло что-то в начале строки!

<?php
// pitfall :
if (strrpos("Hello World", "Hello")) { 
    // never exectuted
}

// smart move :
if (strrpos("Hello World", "Hello") !== False) {
    // that works !
}
?>

И конечно, если Вы имеете дело с состояниями:

Вы хотите иметь значение между DebugMode = False (набор к прочь), DebugMode = True (набор к на) и DebugMode = Null (не набор вообще, приведет к трудной отладке ;-)).

213
ответ дан 23 November 2019 в 22:53
поделиться

Ну, я не могу помнить достаточно со своих дней PHP для ответа на "===" часть, но для большинства языков C-стиля, ПУСТОЙ УКАЗАТЕЛЬ должен использоваться в контексте значений указателя, ложь как булевская переменная и нуль, поскольку числовое значение, таких как интервал '\0' является обычным значением для символьного контекста. Я обычно также предпочитаю использовать 0.0 для плаваний, и удваивается.

Так.. быстрый ответ: контекст.

0
ответ дан 23 November 2019 в 22:53
поделиться

Ложь и 0 концептуально подобна, т.е. они изоморфны. 0 начальное значение для алгебры натуральных чисел, и Ложь является начальным значением для булевой алгебры.

Другими словами, 0 может быть определен как число, которое при добавлении к некоторому натуральному числу приводит к тому же самому числу:

x + 0 = x

Точно так же Ложный значение, таким образом, что разъединение его и любое другое значение являются тем же самым значением:

x || False = x

Пустой указатель является концептуально чем-то полностью различным. В зависимости от языка существует другая семантика для него, но ни один из них не описывает "начальное значение", как Ложь и 0. Нет никакой алгебры для Пустого указателя. Это принадлежит переменным, обычно чтобы обозначить, что переменная не имеет никакого определенного значения в текущем контексте. На большинстве языков нет никаких операций, определенных на Пустом указателе, и это - ошибка использовать Пустой указатель в качестве операнда. На некоторых языках существует специальное значение, названное "нижней частью", а не "пустым указателем", который является заполнителем для значения вычисления, которое не завершается.

Я записал более экстенсивно о последствиях ПУСТОГО УКАЗАТЕЛЯ в другом месте.

0
ответ дан 23 November 2019 в 22:53
поделиться

На в значительной степени всех современных языках пустой указатель логически отсылает к указателям (или ссылки) не наличие значения или переменной, которая не инициализируется. 0 целочисленное значение нуля, и ложь является булевым значением, ну, в общем, лжи. Для создания вещей сложными, в C, например, пустой указатель, 0, и ложь все представлены тот же самый путь. Я не знаю, как это работает в PHP.

Затем для усложнения вещей больше базы данных имеют понятие пустого указателя, что означает отсутствовать или не применимый, и большинство языков не имеет прямого способа отобразить DBNull на их пустой указатель. До недавнего времени, например, не было никакого различия между интервалом, являющимся пустым и являющийся нулем, но это было изменено с nullable ints.

Извините, что сделал этот звук сложным. Это просто, что это было изматывать камнем преткновения на языках в течение многих лет, и до недавнего времени, это не имело никакого ясного разрешения нигде. Люди привыкли для просто вещей клуджа вместе, или сделайте пробел, или 0 представляют, аннулирует в базе данных, которая не всегда работает слишком хорошо.

0
ответ дан 23 November 2019 в 22:53
поделиться

Пустой указатель - ничто, Ложь немного, и 0 (вероятно), 32 бита.

Не эксперт PHP, но на некоторых более современных языках это не является взаимозаменяемым. Я вид мисс, имеющей 0 и лжи быть взаимозаменяемым, но булевской переменной, являющейся фактическим типом, можно было связать методы и объекты с ним так, это - просто компромисс. Пустой указатель является пустым хотя, отсутствие чего-либо по существу.

0
ответ дан 23 November 2019 в 22:53
поделиться

В PHP это зависит от того, если Вы проверяете типы:

( 
 ( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
 ( false !== null ) && ( false == null ) 
)

Технически пустой 0x00 но в PHP ( null == 0x00 ) && ( null !== 0x00 ).

0 целочисленное значение.

1
ответ дан 23 November 2019 в 22:53
поделиться

Я думаю, что плохие разработчики находят, что все различное использование null/0/false там кодирует.

Например, один из наиболее распространенных разработчиков ошибок делают, должен возвратить код ошибки в форме данных с функцией.

// On error GetChar returns -1
int GetChar()

Это - пример сахарного интерфейса. Это - exsplained в книге "Отлаживание процесса разработки программного обеспечения" и также в другой книге, "пишущей правильный код".

Проблема с этим, импликация или предположения, сделанные на символьном типе. На некоторых компиляторах может быть не подписан символьный тип. Таким образом даже при том, что Вы возвращаете-1, компилятор может возвратиться 1 вместо этого. Подобные предположения компилятора в C++ или C трудно определить.

Вместо этого лучший способ не состоит в том, чтобы смешать код ошибки с Вашими данными. Так следующая функция.

char GetChar()

теперь становится

// On success return 1
// on failure return 0
bool GetChar(int &char)

Это означает, неважно, насколько молодой разработчик находится в Вашем магазине разработки, он никогда не будет понимать это превратно. Хотя это не говорит о redudancy или dependies в коде.

Так же в целом подкачивая bool, как тип первого класса на языке хорошо, и я думаю, что joel говорил об этом с его недавним постброском. Но попытайтесь не использовать смешивание и подгонку bools с Вашими данными в Ваших стандартных программах, и необходимо быть совершенно здоровыми.

1
ответ дан 23 November 2019 в 22:53
поделиться

Один интересный факт о NULL в PHP: Если Вы устанавливаете var, равный NULL, это совпадает с, если Вы звонили unset() на нем.

NULL по существу означает, что переменная не имеет никакого значения, присвоенного ему; false допустимое булево значение, 0 допустимое целочисленное значение, и PHP имеет некоторые довольно ужасные преобразования между 0, "0", "", и false.

1
ответ дан 23 November 2019 в 22:53
поделиться

Пустой указатель используется в базах данных для представления "записи" или "никакой информации". Таким образом, у Вас могло бы быть немного поля, которое описывает, "делает этого пользователя, хотят быть посланным электронные письма нами", где Верный означает, что они делают, Ложные средства, они не хотят быть отправленными что-либо, но Пустой указатель означал бы, что Вы не знаете. Они могут появиться посредством внешних объединений и тому подобного.

Логические последствия Пустого указателя часто отличаются - в некотором ПУСТОМ УКАЗАТЕЛЕ языков, ничему не равно, поэтому если (== ПУСТОЙ УКАЗАТЕЛЬ) всегда будет ложь.

Так лично я всегда инициализировал бы булевскую переменную ко ЛЖИ, и инициализация той к ПУСТОМУ УКАЗАТЕЛЮ будет выглядеть немного неприглядной (даже в C, где эти два оба всего 0... просто вещь стиля).

1
ответ дан 23 November 2019 в 22:53
поделиться

Ложь, Пустой указатель, Ничто, 0, Неопределенный, и т.д., и т.д.

Каждый из них имеет определенные значения, которые коррелируют с фактическими понятиями. Иногда разные значения перегружаются в единственное ключевое слово или значение.

В C и C++, NULL, False и 0 перегружаются к тому же значению. В C# они - 3 отличных понятия.

null или NULL обычно указывает на отсутствие значения, но обычно не указывает почему. 0 указывает на нуль натурального числа и имеет эквивалентность типа 1, 2, 3, и т.д. и на языках, которые поддерживают отдельное понятие NULL должен рассматриваться только число.

False указывает на неистину. И это использовало в двоичных значениях. Это не означает сброс, и при этом это не означает 0. Это просто указывает на одно из двух двоичных значений.

Ничто не может указать, что значение конкретно установлено, чтобы быть ничем, что указывает на то же самое как на пустой указатель, но с намерением.

Неопределенный на некоторых языках указывает, что значение должно все же быть установлено, потому что никакой код не указал фактическое значение.

5
ответ дан 23 November 2019 в 22:53
поделиться

Различия между этими значениями всегда сводятся к подробным определенным для языка правилам. То, что Вы изучаете для PHP, не обязательно верно для Python, или Perl или C, и т.д. В то время как ценно изучить правила для языка (языков), Вы работаете с, полагаться на них слишком много напрашивается на неприятности. Проблема прибывает, когда следующий программист должен поддержать Ваш код, и Вы использовали некоторую конструкцию, которая использует в своих интересах некоторую небольшую деталь Пустого указателя по сравнению с Ложью (например). Ваш код должен выглядеть корректным (и с другой стороны, неверный код должен выглядеть неправильным).

1
ответ дан 23 November 2019 в 22:53
поделиться

В PHP можно использовать === и! == операторы, чтобы проверить, равны ли значения, но также и если их типы соответствуют. Так, например: 0 == false true, но 0 === false false. То же идет для != по сравнению с !==. Также в случае, если Вы выдерживаете сравнение null к другим двум использованиям упомянутых операторов ожидайте подобные результаты.

Теперь в PHP это качество значений обычно используется при возвращении значения, которое иногда может быть 0 (нуль), но иногда могло бы случиться так, что функция перестала работать. В таких случаях в PHP Вы возвращаетесь false и необходимо проверить на эти случаи с помощью оператора идентификационных данных ===. Например, если Вы ищете положение одной строки в другой, и Вы используете strpos(), эта функция возвратит числовое положение, которое может быть 0, если строка найдена в самом начале, но если строка не найдена вообще, то strpos() возвратится false и необходимо принять это во внимание при контакте с результатом.

Если Вы будете использовать ту же технику в своих функциях, кто-либо знакомый со стандартной библиотекой PHP поймет то, что продолжается и как проверить, является ли возвращенное значение тем, что требуется или сделало некоторую ошибку, происходят при обработке. То же на самом деле идет для функциональных параметрических усилителей, можно обработать их по-другому в зависимости от того, если они - массивы или строки или что не, и эта техника используется всюду по PHP в большой степени также, таким образом, все получат его довольно легко. Таким образом, я предполагаю, что это - питание.

5
ответ дан 23 November 2019 в 22:53
поделиться

Из онлайн-документации PHP:

Для явного преобразования значения в булевскую переменную используйте (bool) или (булевы) броски.
Однако в большинстве случаев бросок является unncecessary, так как значение будет автоматически преобразовано, если оператор, функциональная или управляющая структура потребует булева аргумента.
При преобразовании в булевскую переменную следующие значения считают ЛОЖЬЮ:

  • булевская переменная FALSE самостоятельно
  • целое число ''0 (нуль)
  • плавание 0.0 (нуль)
  • пустая строка и строка "0"
  • массив с нулевыми элементами
  • объект с нулевыми членскими переменными (только PHP 4)
  • специальный тип NULL (включая переменные сброса)
  • Объекты SimpleXML создаются из пустых тегов
    Любое значение рассматривают TRUE (включая любой ресурс).

Так, в большинстве случаев это - то же.

С другой стороны, === и ==не то же самое. Регулярно, Вам просто нужно, "равняется" оператору. Разъясниться:

$a == $b    //Equal. TRUE if $a is equal to $b.
$a === $b   //Identical. TRUE if $a is equal to $b, and they are of the same type. 

Для получения дополнительной информации проверьте страницу "Comparison Operators" в PHP документы онлайн.

Надеюсь, это поможет.

2
ответ дан 23 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: