سؤال

لدى PHP عادة تقييم (int)0 و(string)"0" على أنها فارغة عند استخدام empty() وظيفة.يمكن أن يكون لهذا نتائج غير مقصودة إذا كنت تتوقع قيمًا رقمية أو سلسلة بقيمة 0.كيف يمكنني "إصلاحها" لإرجاع صحيح فقط إلى الكائنات الفارغة والمصفوفات والسلاسل وما إلى ذلك؟

هل كانت مفيدة؟

المحلول

وهذا لا يعمل بالنسبة لي.

if (empty($variable) && '0' != $variable) {
  // Do something
}

ولقد استخدمت بدلا من ذلك:

if (empty($variable) && strlen($variable) == 0) {
  // Do something
}

نصائح أخرى

وأنا نادرا ما تستخدم empty() لسبب تصفون. فإنه يخلط بين القيم المشروعة مع الفراغ. ربما لأن أفعل الكثير من العمل في SQL، ولكن يفضل استخدام NULL للدلالة على عدم وجود قيمة.

وPHP لديه وظيفة is_null() الذي يختبر لكونها NULL متغير أو تعبير.

$foo = 0;
if (is_null($foo)) print "integer 0 is null!\n"; 
else print "integer 0 foo is not null!\n";

$foo = "0";
if (is_null($foo)) print "string '0' is null!\n"; 
else print "string '0' is not null!\n";

$foo = "";
if (is_null($foo)) print "string '' is null!\n"; 
else print "string '' is not null!\n";

$foo = false;
if (is_null($foo)) print "boolean false is null!\n"; 
else print "boolean false is not null!\n";

ويمكنك أيضا استخدام يساوي بالضبط === المشغل للقيام اختبار مماثل:

if ($foo === null) print "foo is null!\n";

وهذا صحيح إذا $foo هو NULL، ولكن ليس اذا كان false، الصفر، ""، وما إلى ذلك.

و"0" هو تعتبر دائما كاذبة (أو فارغة) في PHP، وأنها لا تجعل الكثير من معانيها (وليس أنني سوف يجادلون بأن هنا). إذا كنت تريد أن يكون الصفر تقييم إلى true كذلك، استخدم strlen($value).

و"إصلاح" هو جهة نظر واحدة. سيكون آخر لنفترض انها ليست "كسر"، وتعلم كيفية العمل معها الطريقة التي تم تصميمها عمدا.

ونظرا للمشكلة كما كنت أصف ذلك، فإن أفضل شيء أن يكون لتشديد التعليمات البرمجية بحيث لا يمكن وضع المتغير إلى دولة غير محددة النوع. خلاف ذلك، سوف تحتاج إلى اختبار لنوع البيانات باستخدام gettype ().

وأنا دائما إضافة إلى بلدي مصدر برنامج

function is_blank($value) {
    return empty($value) && !is_numeric($value);
}

واستخدامه بدلا من فارغة (). أنه لا يحل مسألة حفظ الأصفار (كثافة العمليات، تعويم أو سلسلة) على أنها غير فارغة.

http://www.php.net/manual/en /function.empty.php#103756 التي أضيفت مايو 2011.

بشكل عام، تريد استخدام عامل التشغيل الثلاثي يساوي لتحديد متى تكون القيمة فارغة أو خاطئة.هذا هو أكثر تحديدا والنتائج دائماً العودة تماما كما هو متوقع.

يبدو أن إنشاء وظيفة منفصلة للقيام بشيء يمكنك القيام به في سطر واحد من التعليمات البرمجية ولكن باستخدام عامل تشغيل مختلف أمر معقد للغاية ويضيف المزيد من التشويش.

بالإضافة إلى ذلك، يميل العديد من المبرمجين إلى استخدام 0 أو سلسلة فارغة للإشارة إلى قيمة غير موجودة ولكن من الأصح (وأشعر أن الممارسة أفضل) استخدام قيمة فارغة للإشارة إلى أي قيمة (بغض النظر عن النوع) غير موجودة حقًا -موجود.

وأنا استخدم هذا للكشف عن الفراغ:

''  --> true
'0' --> false
0   --> false

وظيفة:

function is_empty_or_zero($str) {
 return (is_null($str) || ($str === ''));
}

وأنا خلقت IsEmpty() وظيفة سريعة مقتضبة.

function IsEmpty($mData) {
    return is_int($mData) ? false : 
        is_string($mData) ? $mData=="" : 
        empty($mData);
}

وأنت تحاول استخدام empty() عن شيء انها ليست معدة لل. شخصيا، أعتقد يأتي ذلك في السلوك من نموذج البرمجة السن في PHP وربما يمكن سحبها.

وبدلا من ذلك، جعل الشيكات الخاصة بك أكثر وضوحا. بدلا من التحقق إذا كانت قيمة غير مفيدة، والتحقق من ذلك. على سبيل المثال، إذا كنت تريد صفيف، التحقق من ذلك من مجموعة (is_array()) بدلا من التحقق ما اذا كان السلسلة.

وبالإضافة إلى ذلك، يمكنك الاعتماد على حقيقة أن جميع المتغيرات $_POST و$_GET هي سلاسل، حتى تتمكن من إجراء مقارنات إلى ""، أو تحقق من أن strlen() == 0.

if ( is_int($val) || !empty($val) ) {;}

ord وظيفة للتحقق سواء كانت القيمة التي تم تمريرها فارغة أم لا .

/*
* SPACE is not empty - Please do trim before using this function for your own purpose
*  var_dump(is_having_value(0));        // true
   var_dump(is_having_value(0000));     // true
   var_dump(is_having_value("    0"));  // true
   var_dump(is_having_value(""));       // false
   var_dump(is_having_value("  "));     // true
   var_dump(is_having_value('\t'));     // true
   var_dump(is_having_value(''));       // false
   var_dump(is_having_value('o'));      // true
   var_dump(is_having_value('O'));      // true
   var_dump(is_having_value('0'));      //true
   var_dump(is_having_value(null));     //false
   var_dump(is_having_value());         //false
*/
function is_having_value($val = null) {
    if (is_array($val) || is_object($val)):
        $logic_empty = empty($val);
        return !$logic_empty;
    else:
        $ascii = ord($val);
        if ($ascii == 48 || $ascii = 0 || $ascii == 32):
            return true;
        else:
            $logic_empty = empty($val);
            return !$logic_empty;
        endif;
    endif;
}

والحل الأكثر فعالية لهذه المشكلة هو لاختبار إذا كان المتغير هو منها مثلا كاذبة.


if (!$variable_name) {echo $variable_name;}

لا يهم إذا كان المتغير فارغا أو باطل، كل ذلك يساوي كاذبة عندما وضعت في إذا كان مشروطا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top