Лучший способ протестировать на существование переменной в PHP; isset () ясно повреждается

from flask import Flask, request, jsonify

@app.route('/added', methods=['POST'])
def add():
    data = request.get_json(force=True)
    l = {'name': data['name']}
    lingual.append(l)

    return jsonify({'lang': lingual})
186
задан Community 23 May 2017 в 01:54
поделиться

7 ответов

Если бы переменная, которую Вы проверяете, была бы в глобальной области видимости, Вы могли бы сделать:

array_key_exists('v', $GLOBALS) 
96
ответ дан Mark Amery 23 November 2019 в 05:50
поделиться

Я должен сказать во всех своих годах относительно программирования PHP, я никогда не встречался с проблемой с isset() возвращающий false на пустой переменной. OTOH, у меня есть возникшие проблемы с isset() сбой на пустой записи массива - но array_key_exists() работы правильно в этом случае.

Для некоторого сравнения, Значок явно определяет неиспользуемую переменную как возврат &null, таким образом, Вы используете тест-пустого-указателя в Значке, чтобы также проверить на переменную сброса. Это действительно делает вещи легче. С другой стороны, Visual Basic имеет несколько состояний для переменной, которая не имеет значения (Пустым, Пустым, Ничто...), и часто необходимо проверять на больше чем одного из них. Это, как известно, источник ошибок.

0
ответ дан staticsan 23 November 2019 в 05:50
поделиться

Попытайтесь использовать

unset($v)

, Это кажется единственным временем, переменная не установлена, когда это конкретно сброшено ($v). Это кажется, что Ваше значение 'существования' отличается, чем определение PHP. ПУСТОЙ УКАЗАТЕЛЬ является, конечно, существующим, это является ПУСТЫМ.

1
ответ дан Joe Phillips 23 November 2019 в 05:50
поделиться

Если я выполняю следующее:

echo '<?php echo $foo; ?>' | php

я получаю ошибку:

PHP Notice:  Undefined variable: foo in /home/altern8/- on line 1

, Если я выполняю следующее:

echo '<?php if ( isset($foo) ) { echo $foo; } ?>' | php

я не получаю ошибку.

, Если у меня есть переменная, которая должна быть установлена, я обычно делаю что-то как следующее.

$foo = isset($foo) ? $foo : null;

или

if ( ! isset($foo) ) $foo = null;

Тот путь, позже в сценарии, я могу безопасно использовать $foo и знать, что это "установлено", и что это принимает значение по умолчанию к пустому указателю. Позже я могу if ( is_null($foo) ) { /* ... */ }, если я должен и знаю наверняка, что переменная существует, даже если это является пустым.

полное isset документация чтения немного больше, чем, что первоначально вставлялось. Да, это возвращает false для переменной, которая была ранее установлена, но теперь пустая, но это также возвращает false, если переменная еще не устанавливалась (никогда) и ни для какой переменной, которая была отмечена как сброс. Это также отмечает, что ПУСТОЙ байт (" \0") не считают пустым и возвратит true.

Определяют, установлена ли переменная.

, Если переменная была сброшена со сбросом (), это больше не будет устанавливаться. isset () возвратит FALSE при тестировании переменной, которая была установлена в NULL. Также обратите внимание, что ПУСТОЙ байт (" \0") не эквивалентен ПУСТОЙ константе PHP.

1
ответ дан Beau Simensen 23 November 2019 в 05:50
поделиться

Свойства объектов могут быть проверены на существование пример property_exists

от модульного теста:

function testPropertiesExist()
{
    $sl =& $this->system_log;
    $props = array('log_id',
                   'type',
                   'message',
                   'username',
                   'ip_address',
                   'date_added');

    foreach($props as $prop) {
        $this->assertTrue(property_exists($sl, $prop),
                           "Property <{$prop}> exists");
    }
}
9
ответ дан 23 November 2019 в 05:50
поделиться

Вы можете использовать компактную языковую конструкцию для проверки на существование нулевой переменной. Переменные, которых не существует, в результате не появятся, а нулевые значения покажут.

$x = null;
$y = 'y';

$r = compact('x', 'y', 'z');
print_r($r);

// Output:
// Array ( 
//  [x] => 
//  [y] => y 
// ) 

В случае с вашим примером:

if (compact('v')) {
   // True if $v exists, even when null. 
   // False on var $v; without assignment and when $v does not exist.
}

Конечно, для переменных в глобальном масштабе вы также можете использовать array_key_exists().

B.t.w. Лично я бы избегал ситуаций вроде чумы, когда есть семантическая разница между несуществующей переменной и переменной, имеющей нулевое значение. PHP и большинство других языков просто не думают, что есть.

.
17
ответ дан 23 November 2019 в 05:50
поделиться

Объяснение NULL, логическое мышление

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

Правильно обращаться с NULL

NULL следует рассматривать как «несуществующее значение», что является значением NULL. Переменная не может быть классифицирована как существующая в PHP, потому что она не была сказал, каким типом сущности он пытается быть. Он также может не существовать, поэтому PHP просто говорит: «Хорошо, это не так, потому что в этом нет никакого смысла, а NULL - мой способ сказать это».

Аргумент

Давайте теперь поспорим. «Но NULL - это то же самое, что сказать 0 или FALSE или».

Wrong, 0-FALSE- '' все по-прежнему классифицируются как пустые значения, но они УКАЗАНЫ как некоторый тип значения или заранее определенный ответ на вопрос. FALSE - это ответ на вопрос «да» или «нет», '' - это ответ на заголовок, который кто-то прислал, а 0 - это ответ на количество или время и т. Д. ARE установлены как некоторый тип ответа / результата, что делает их действительными как установленные.

NULL - это просто нет ответа, что бы то ни было, он не говорит нам да или нет, он не сообщает нам время и не Не говорите нам, что отправлена ​​пустая строка. Это основная логика в понимании NULL.

Резюме

Речь идет не о создании дурацких функций, чтобы обойти проблему, это просто меняет то, как ваш мозг смотрит на NULL. NULL, предположим, что он не установлен как что-либо. Если вы предварительно определяете переменные, тогда предварительно определите их как 0, FALSE или "" в зависимости от типа их использования.

Не стесняйтесь цитировать это. Это не в моей голове :)

15
ответ дан 23 November 2019 в 05:50
поделиться
Другие вопросы по тегам:

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