更好的方法来检查variables为空或空string?
由于PHP是一种dynamic语言,检查提供的字段是否为空的最佳方法是什么?
我想确保:
- null被认为是一个空string
- 只有空格的string被认为是空的
- 那“0”不被认为是空的
这是我到目前为止:
$question = trim($_POST['question']); if ("" === "$question") { // Handle error here } 必须有一个更简单的方法来做到这一点?
 // Function for basic field validation (present and neither empty nor only white space function IsNullOrEmptyString($question){ return (!isset($question) || trim($question)===''); } 
旧post,但有人可能需要它,像我一样;)
 if (strlen($str) == 0){ do what ever } 
 用你的variablesreplace$str 。  NULL和""都使用strlen时返回0。 
使用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) 
有关更多详情,请查看空白function
我会虚心接受,如果我错了,但我testing了我自己的一端,发现以下作品testingstring(0)“”和NULL值variables:
 if ( $question ) { // Handle success here } 
也可以倒过来来testing成功的原因:
 if ( !$question ) { // Handle error here } 
 注意trim()函数的假阴性 – 在修剪之前它会执行一个cast-to-string,因此如果传递一个空数组,它将返回例如“Array”。 这可能不是问题,具体取决于您如何处理数据,但是使用您提供的代码,可以在POST数据中提供名为question[]的字段,并且显示为非空string。 相反,我会build议: 
 $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 
没有更好的方法,但由于这是一个你经常做的操作,所以你最好自动化一下这个过程。
大多数框架提供了一个方法来parsing一个简单的任务参数。 你可以build立你自己的对象。 快速和肮脏的例子:
 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大量使用那种糖。
但是你说的比这更多,用你的“//处理错误在这里”。 您正在混合2个工作:获取数据并处理它。 这完全不一样。
还有其他的机制可以用来validation数据。 再次,框架可以展示给你最好的实践。
创build表示表单数据的对象,然后附加处理并回退。 这听起来有更多的工作要攻击一个快速的PHP脚本(这是第一次),但它是可重用的,灵活的,而且更不容易出错,因为使用通常的PHP进行表单validation往往会变成spaguetti代码。
这个检查数组和string:
 function is_set($val) { if(is_array($val)) return !empty($val); return strlen(trim($val)) ? true : false; } 
 当你想检查一个字段是否提供了一个值时,这个字段可能是一个string ,一个array ,或者是未定义的。 所以,以下就足够了 
 function isSet($param) { return (is_array($param) && count($param)) || trim($param) !== ''; } 
empty()用于为此工作,但empty()的行为已经多次更改。 与往常一样,PHP文档始终是确切行为的最佳来源,并且这些页面上的评论通常提供了随时间变化的良好历史logging。 如果你想检查对象属性的缺乏,目前一个非常防御的方法是:
 if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {