لا مزيد من الحلول الالتفافية: تعرف على str_starts_with و str_ends_with في PHP 8
\n\nهل سبق لك أن كتبت كودًا مثل if (strpos($str, 'prefix') === 0) وشعرت أنه يبدو غير أنيق؟ أو ربما أهدرت وقتًا في فك شفرة substr($str, -3) === 'end' للتحقق من نهاية السلسلة النصية؟ إذا كان الأمر كذلك — لدي خبر رائع لك. بدءًا من PHP 8.0، ظهرت في اللغة دالتان أنيقتان وبديهيتان: str_starts_with() و str_ends_with().
في هذه المقالة، سنقوم بتحليلهما بالتفصيل. ستتعرف على كيفية عملهما، وكيف يختلفان عن الطرق القديمة، ولماذا يجب استخدامهما في كل مشروع PHP حديث. سنستعرض أيضًا أمثلة واقعية من حياة المطور — بدءًا من التحقق من URL وصولاً إلى التحقق من صحة البريد الإلكتروني والعمل مع مسارات الملفات.
\n\nما هما str_starts_with() و str_ends_with()؟
\n\nهاتان دالتان مدمجتان في PHP 8 تسمحان لك بالتحقق مما إذا كانت السلسلة النصية تبدأ بسلسلة فرعية معينة، أو تنتهي بها. ترجعان قيمة منطقية (true أو false)، مما يجعلهما مثاليتين للاستخدام في الشروط.
إليك الصيغة الأساسية لهما:
\n\nstr_starts_with(string $haystack, string $needle): bool\nstr_ends_with(string $haystack, string $needle): bool\n\nحيث $haystack هي السلسلة النصية التي تفحصها، و $needle هي السلسلة الفرعية التي تبحث عنها في البداية أو النهاية.
مثال بسيط
\n\n<?php\n$string = "Hello, world!";\n\n// التحقق مما إذا كانت السلسلة تبدأ بـ "Hello"\nif (str_starts_with($string, "Hello")) {\n echo "السلسلة تبدأ بـ 'Hello'"; // سيتم تنفيذ هذا الكود\n}\n\n// التحقق مما إذا كانت السلسلة تنتهي بـ "world!"\nif (str_ends_with($string, "world!")) {\n echo "السلسلة تنتهي بـ 'world!'"; // وهذا أيضًا\n}\n?>\n\nبسيط، أليس كذلك؟ لا حسابات إضافية، ولا === 0 أو strlen(). مجرد تحقق ونتيجة.
لماذا هذا مهم؟ مشاكل الطرق القديمة
\n\nقبل PHP 8، كان على المطورين الالتفاف. كانت الطريقة الأكثر شيوعًا للتحقق من بداية السلسلة النصية تبدو هكذا:
\n\nif (strpos($string, 'prefix') === 0) { ... }\n\nما المشكلة هنا؟ strpos() تبحث عن السلسلة الفرعية في أي مكان في السلسلة النصية، وليس فقط في البداية. صحيح أن التحقق === 0 يستبعد النتائج غير الصحيحة، لكن الكود نفسه لا يعبر عن نية المطور. تنظر إليه وتفكر: "آه، إنه يتحقق مما إذا كانت تبدأ بـ... أم أنه يبحث فقط؟" — هذا يقلل من قابلية القراءة.
أما التحقق من نهاية السلسلة النصية فكان أقل بديهية:
\n\nif (substr($string, -3) === 'end') { ... }\n\nهنا تحتاج إلى معرفة طول السلسلة الفرعية بدقة (-3)، مما يؤدي إلى أخطاء إذا أدخلت رقمًا غير صحيح. بالإضافة إلى ذلك، إذا كانت السلسلة الفرعية أطول من السلسلة النصية نفسها — فإن substr() سترجع ببساطة سلسلة فارغة، ولن يتحقق الشرط أبدًا.
الدالتان الجديدتان str_starts_with() و str_ends_with() تحلان كل هذه المشاكل:
- \n
- قابلية القراءة: الكود يتحدث عن نفسه. \n
- الموثوقية: لا حاجة للتفكير في طول السلسلة الفرعية أو السلاسل الفارغة. \n
- الأداء: الدالتان محسنتان على مستوى نواة PHP. \n
أمثلة واقعية للاستخدام في تطوير الويب
\n\nدعنا نرى أين يمكن أن تكون هذه الدوال مفيدة عمليًا. لقد اخترت عدة سيناريوهات من المحتمل أنك واجهتها في عملك.
\n\n1. التحقق من بادئات URL (التوجيه، إعادة التوجيه)
\n\nلنفترض أنك تكتب موجهًا بسيطًا وتريد معالجة عناوين URL التي تبدأ بـ /admin:
<?php\n$uri = $_SERVER['REQUEST_URI'];\n\nif (str_starts_with($uri, '/admin')) {\n echo "أنت في لوحة التحكم";\n // تحميل