更好的方法检查变量为null或空字符串?

既然PHP是一种动态语言,那么检查所提供字段是否为空的最佳方法是什么?

我要确保:

  1. Null被认为是空字符串
  2. 只有空格的字符串被认为是空的
  3. 那个“0”不是空的

这是我目前得到的:

$question = trim($_POST['question']);


if ("" === "$question") {
// Handle error here
}

一定有更简单的方法吧?

291401 次浏览
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
return ($str === null || trim($str) === '');
}

没有更好的方法,但由于这是一个你经常做的操作,你最好自动化这个过程。

大多数框架都提供了一种使参数解析变得简单的方法。你可以为此创建自己的对象。举个简单的例子:

class Request
{


// This is the spirit but you may want to make that cleaner :-)
function get($key, $default=null, $from=null)
{
if ($from) :
if (isset(${'_'.$from}[$key]));
return sanitize(${'_'.strtoupper($from)}[$key]); // didn't test that but it should work
else
if isset($_REQUEST[$key])
return sanitize($_REQUEST[$key]);


return $default;
}


// basics. Enforce it with filters according to your needs
function sanitize($data)
{
return addslashes(trim($data));
}


// your rules here
function isEmptyString($data)
{
return (trim($data) === "" or $data === null);
}




function exists($key) {}


function setFlash($name, $value) {}


[...]


}


$request = new Request();
$question= $request->get('question', '', 'post');
print $request->isEmptyString($question);

Symfony大量使用这种糖。

但是你谈论的不仅仅是这些,你的“// Handle错误在这里 ”。您混合了两项工作:获取数据和处理数据。

您还可以使用其他机制来验证数据。同样,框架可以向您展示最佳实践。

创建表示表单数据的对象,然后附加流程并返回到它。这听起来比破解一个快速的PHP脚本要费时得多(这是第一次),但是它是可重用的、灵活的,而且更不容易出错,因为使用普通PHP进行表单验证往往很快就会变成spaguetti代码。

当心trim()函数的假否定-它在修整之前执行强制转换为字符串,因此将返回例如。数组,如果你传递给它一个空数组。这可能不是问题,这取决于您如何处理数据,但对于您提供的代码,可以在POST数据中提供名为question[]的字段,并且看起来是非空字符串。相反,我建议:

$question = $_POST['question'];


if (!is_string || ($question = trim($question))) {
// Handle error here
}


// If $question was a string, it will have been trimmed by this point

旧帖子,但有人可能会像我一样需要它;)

if (strlen($str) == 0){
do what ever
}
用你的变量替换$strNULL""在使用strlen时都返回0

如果我错了,我会谦虚地接受,但我在自己的一端进行了测试,发现下面的代码可以用于测试字符串(0)""和NULL值变量:

if ( $question ) {
// Handle success here
}

这也可以反过来测试是否成功:

if ( !$question ) {
// Handle error here
}

使用PHP的empty()函数。以下的东西被认为是空的

"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
$var; (a variable declared, but without a value)

更多细节请查看空函数

Empty()曾经为此工作,但Empty()的行为已经改变了几次。与往常一样,php文档始终是准确行为的最佳来源,这些页面上的注释通常提供了随时间变化的良好历史记录。如果你想检查对象属性的缺乏,目前一个非常防御性的方法是:

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {

当你想检查一个字段是否提供了一个值时,这个字段可以是stringarray或未定义的。所以,以下内容就足够了

function isSet($param)
{
return (is_array($param) && count($param)) || trim($param) !== '';
}

它检查数组而且字符串:

function is_set($val) {
if(is_array($val)) return !empty($val);


return strlen(trim($val)) ? true : false;
}

为了更健壮(制表,返回…),我定义:

function is_not_empty_string($str) {
if (is_string($str) && trim($str, " \t\n\r\0") !== '')
return true;
else
return false;
}


// code to test
$values = array(false, true, null, 'abc', '23', 23, '23.5', 23.5, '', ' ', '0', 0);
foreach ($values as $value) {
var_export($value);
if (is_not_empty_string($value))
print(" is a none empty string!\n");
else
print(" is not a string or is an empty string\n");
}

来源:

用这个:

// check for null or empty
if (empty($var)) {
...
}
else {
...
}