تتبع أربع حالات وجعل الصفحة أكثر أمانًا
تتبّع الآن الصفحة بالاختيارات الأربعة وبلا Apply أيضًا. لا يضيء المصباح إلا مع on وon. تعمل الصفحة، لكنها تثق بما يصلها. فالمتصفح يستطيع أن يرسل أي نص، لا الخيارات التي عرضناها فقط: قد يرسل زائر، أو برنامج آخر، النص maybe أو ON. وتنسخ الصفحة النص دون فحص، فتتوقف النتيجة على نص لم نخطط له. والنسخة الأكثر أمانًا تحتفظ بقائمة القيم المسموحة on وoff. فإن كانت القيمة المستلمة في القائمة استُعملت، وإلا استُبدلت بـ off. ويستعمل الفحص === لكي لا يُقبل إلا on وoff تمامًا، وتعطي ?? نصًا فارغًا حين تغيب قيمة. والدالة lamp تفعل ذلك كله وتعيد الاختيارين المقبولين والمصباح. وثمة زلة أخرى في صفحة الكتاب تستحق أن نعرفها: إذا كان المصباح نفسه صورة يُنقر عليها فإن النقر يرسل النموذج دون اسم زر Apply، فتنسى الصفحة الاختيارين وتعرض الحالة الابتدائية.
| القيمة المستلمة | تستعمل الصفحة الأكثر أمانًا |
|---|---|
| on | on |
| off | off |
| maybe | off |
| ON | off |
| (غائبة) | off |
| list1 | list2 | ماذا تقول الصفحة |
|---|---|---|
| off | off | The lamp is unlit. |
| on | off | The lamp is unlit. |
| off | on | The lamp is unlit. |
| on | on | The lamp is lit. |
| (بلا Apply) | (بلا Apply) | The lamp is unlit. |
1function lamp(array $post): string { 2 $allowed = ["on", "off"]; 3 $first = "off"; 4 $second = "off"; 5 $state = "unlit"; 6 if (isset($post['apply'])) { 7 $first = in_array($post['list1'] ?? "", $allowed, true) ? $post['list1'] : "off"; 8 $second = in_array($post['list2'] ?? "", $allowed, true) ? $post['list2'] : "off"; 9 $state = ($first === "on" && $second === "on") ? "lit" : "unlit"; 10 } 11 return "$first $second $state"; 12} 13 14echo lamp([]), "\n"; 15echo lamp(['apply' => 'Apply', 'list1' => 'on', 'list2' => 'on']), "\n"; 16echo lamp(['apply' => 'Apply', 'list1' => 'on', 'list2' => 'off']), "\n"; 17echo lamp(['apply' => 'Apply', 'list1' => 'maybe', 'list2' => 'on']);
off off unlit on on lit on off unlit off on unlit
تتبّع الدالة الأكثر أمانًا على الورق للاستدعاءات الآتية: Apply مع list1 = off وlist2 = on؛ وApply مع ON وON؛ وApply مع list2 = on فقط؛ واستدعاء بلا Apply. اكتب النص المعاد لكل منها.