سؤال

تحرير: أعتقد أنه من المحتمل أن يتم إنشاء هذا الرسم من خلال هذا الرمز في الجزء العلوي من الصفحة التي أختبرها لقيمة الخيار ... هذا ينشئ طريقة اختصار للإشارة إلى الخيار دون استخدام Get_option ('الخيار ') طريقة...

global $options;
foreach ($options as $value) {
if (get_settings( $value['id'] ) === FALSE) { 
        $$value['id'] = $value['std']; 
    } else { 
        $$value['id'] = get_settings( $value['id'] );
    }
}

وهكذا عندما أقوم بتعيين قيمة المتغير ، $ myvar ، عبر مربع الاختيار تم فحصه في لوحة خيارات السمة الخاصة بي وانقر فوق "حفظ" ، ثم عرض خياراتي.

true

وعندما أقوم بإجراء بحث على هذا المتغير باستخدام

if($myvar == "true")

لقد مرت.

ومع ذلك ، عندما أقوم بتعيين القيمة مباشرة عبر طريقة update_options () ، مثل ...

$mvar = true;
update_option('myvar', $myvar);

تتغير القيمة من True إلى 1

وعندما أفعل نفس المقارنة كما كان من قبل ، إذا ($ myvar == "true") ، فإنه يفشل الآن. لم يعد "صحيحًا".

ماذا ينقصني؟ (1) لماذا "صحيح" و 1 ، وليس تقييم نفس الشيء و (2) ما هي طريقة update_option إلى قيمة myvar لتغيير القيمة من True إلى 1؟

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

المحلول

محاولة

if($myvar == true)

و

$myvar = true;

TRUE و FALSE هي متغيرات منطقية في PHP والتي تعتبر عالمية أكثر بكثير من سلسلة حقيقية.


حول update_option. قد لا يكون الخيار هو تغييره إلى 1. بدلاً من ذلك ، قد يكون ذلك عند إدخاله في قاعدة البيانات ، ويقوم بإدخاله كسلسلة "true". ثم ، عندما يعود يتم تحويله إلى قيمة منطقية true, ، عند الطباعة 1

نصائح أخرى

محاولة

if ($myvar)

لا تختبر ما إذا كانت الأشياء "متساوية" صحيحة ، فهي إما صحيحة أو أنها ليست كذلك.

يجب عليك تغيير الاختبار الأول إلى if($myvar == true) أو ببساطة if ($myvar). PHP لديه بعض القواعد الغريبة لما هو "صحيح" ؛ بشكل عام ، تم إبعاد الأوتار إلى الحقيقية ، باستثناء الحالات الخاصة "0" وسلسلة فارغة "", ، أي نوع من الكاذبة.

في مثالك المحدد ، if ($myvar == "true"):

  • لو $myvar يحتوي على منطقية ، وسيقوم التعبير بتقييم AS (bool) == (bool)"true", ، أو (bool) == true
  • لو $myvar يحتوي على عدد صحيح ، يتم إلقاؤه بسلسلة ومقارنة مع السلسلة "True" ؛ لذا فإن الاختبار الخاص بك فشل ، لأن "1"! = "صحيح".
  • لو $myvar هي سلسلة ، يتم مقارنة السلسلة ، وفجأة فقط السلسلة الحرفية "true" سوف تقارن بنجاح.

أعتقد أن الحالات الثانية والثالثة سارية: من المحتمل أن يكون WordPress إعدادًا $myval إلى السلسلة "true" عندما يتم نشر من مرة أخرى ، لذلك يمر الاختبار الخاص بك. عندما تحدد يدويًا منطقية true, ، يجب أن يقوم WordPress بتحويله إلى عدد صحيح ، ثم يتم مقارنة عدد صحيح وتفشل ، لأنه سيتم إلقاء عدد صحيح 1 على السلسلة "1" بالمقارنة مع "true".

أنت تقوم بمقارنة فضفاضة بين عدد صحيح 1 والسلسلة "true". لهذا سوف PHP ترجمة السلسلة إلى رقم. "الاختبار" كرقم هو 0:

var_dump((int) 'true'); // int(0)

وبما أن 0 لا يساوي 1 ، فإن المقارنة ستعود كاذبة.

مثل بعض الإجابات الأخرى التي أشرت بالفعل بشكل صحيح ، يجب عليك الاختبار مقابل المنطقية الحرفية TRUE أو true. إذا كان أحد المشغلين في فحص المساواة هو منطقية ، فسيقوم PHP بتحويل المشغل الآخر إلى منطقية أيضًا ، والتي ستقدم ، بالنسبة للرقم 1 ، للرقم 1

var_dump((bool) 1); // boolean(true)

وبعد ذلك سوف يمر الاختبار الخاص بك ، لأن TRUE يساوي TRUE.

تفحص ال نوع جدول المقارنة لفهم كيف أن أنواع php juggles عندما اختبار للمساواة.

أما لما check_update لا إلى منطقتك ، تحقق من وصف الوظيفة:

(مختلط) (مطلوب) القيمة الجديدة لاسم الخيار هذا. يمكن أن تكون هذه القيمة سلسلة أو صفيف أو كائن أو قيمة تسلسلية.

لذلك ، لا السماح منطقية. لقد حاولت لفترة وجيزة معرفة ذلك من مصدر الرمز حيث يتم التحويل ، ولكن بما أن WP هو فوضى بالنسبة لي ، لم يستطع العثور عليه. كما اقترح شخص آخر ، ربما يحدث ذلك عند تخزينه إلى قاعدة البيانات ثم استعادتها.

"True" عبارة (bool) $string. true من ناحية أخرى ، بدون اقتباسات ، هو منطقية وسيقوم بتقييم 1.

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