كيفية الحصول على امتداد الملف في PHP: أفضل الممارسات لعام 2025
\n\nهل سبق لك أن واجهت موقفًا تحتاج فيه إلى تحديد نوع الملف الذي يقوم المستخدم بتحميله بسرعة - هل هو صورة أم مستند أم أرشيف؟ أو ربما تكتب محلل ملفات وتحتاج إلى معالجة مئات الامتدادات ديناميكيًا؟ سؤال "How can I get a file's extension in PHP?" ظل لسنوات عديدة من بين الأسئلة الأكثر شيوعًا على Stack Overflow، حيث حصد مئات الآلاف من المشاهدات. وهذا ليس من قبيل الصدفة.
\n\nقد يبدو الأمر بسيطًا؟ خذ سلسلة نصية، ابحث عن النقطة، واقطع الجزء الذي يليها. لكن PHP لغة ذات طابع خاص. فهي تقدم عدة دوال مدمجة، واختيار الدالة الصحيحة يعتمد على السياق. في عام 2025، عندما تكون الأمان والأداء أكثر أهمية من أي وقت مضى، سنقوم بتحليل جميع الطرق الحالية وتحديد أفضلها.
\n\nفي هذه المقالة، ستتعلم:
\n- \n
- خمس طرق عملية للحصول على امتداد الملف في PHP. \n
- أي طريقة يجب استخدامها في 95% من الحالات. \n
- كيف لا تقع في فخ الملفات بدون امتداد أو التي تحتوي على نقاط متعددة. \n
- أمثلة كود حقيقية قابلة للنسخ. \n
الطريقة 1: الكلاسيكية — pathinfo()
\n\nإذا سألت أي مطور PHP ذي خبرة عن كيفية الحصول على امتداد الملف، فسيجيب دون تردد: pathinfo(). هذه هي الطريقة الأكثر شيوعًا والموصى بها. تقوم الدالة بإرجاع مصفوفة تحتوي على معلومات حول المسار: الدليل، اسم الملف، الامتداد، والاسم الكامل.
<?php\n$file = 'document.pdf';\n$extension = pathinfo($file, PATHINFO_EXTENSION);\necho $extension; // سيطبع: pdf\n?>\n\n\nجمال هذه الطريقة يكمن في بساطتها وسهولة قراءتها. تمرر اسم الملف والثابت PATHINFO_EXTENSION - وتحصل على نتيجة نظيفة بدون أحرف زائدة. تتعامل pathinfo() بشكل صحيح مع معظم الحالات القياسية، بما في ذلك الملفات ذات النقاط المتعددة، مثل archive.tar.gz - في هذه الحالة سترجع gz، وهو أمر منطقي لأنه الامتداد النهائي.
المزايا: بديهية، دالة مدمجة، تعمل مع مسارات بأي تعقيد.
\nالعيوب: قد ترجع سلسلة فارغة إذا لم يكن للملف امتداد.
\n\nالطريقة 2: العمل مع السلاسل النصية — strrchr() + substr()
\n\nأحيانًا في الكود القديم أو الأمثلة التعليمية، يمكنك رؤية تحليل يدوي. الفكرة بسيطة: ابحث عن آخر نقطة في السلسلة النصية وخذ كل ما بعدها.
\n\n<?php\n$file = 'image.jpg';\n$extension = substr(strrchr($file, '.'), 1);\necho $extension; // سيطبع: jpg\n?>\n\n\nتجد الدالة strrchr() آخر ظهور للحرف وترجع كل شيء بدءًا منه (بما في ذلك النقطة). تقوم substr() مع المعامل 1 باقتطاع النقطة. تعمل بشكل موثوق، لكن الكود يصبح أقل قابلية للقراءة.
حقيقة مثيرة للاهتمام: هذه الطريقة هي وريثة مباشرة لعصر الدوال الشبيهة بـ C. إنها أسرع من pathinfo() في الاختبارات الصغيرة، لكن الفرق غير ملحوظ في المشاريع الحقيقية. استخدمها إذا كنت تكتب محللًا عالي الضغط وكل ميكروثانية لها أهميتها.
الطريقة 3: السريعة وغير الدقيقة — explode()
\n\nالطريقة الأكثر سذاجة التي تتبادر إلى ذهن المبتدئين: تقسيم السلسلة النصية بناءً على النقطة وأخذ آخر عنصر في المصفوفة.
\n\n<?php\n$file = 'report.xlsx';\n$parts = explode('.', $file);\n$extension = end($parts);\necho $extension; // سيطبع: xlsx\n?>\n\n\nتحذير: هذه ممارسة سيئة. لماذا؟ تخيل ملفًا باسم my.file.name.txt. ستقوم explode() بتقسيمه إلى 4 أجزاء، وستعيد end() قيمة txt. يبدو صحيحًا. لكن ماذا لو كان اسم الملف .htaccess؟ ستكون المصفوفة ['', 'htaccess']، وسيتم إرجاع الامتداد كـ htaccess، على الرغم من أن هذا هو اسم الملف بالكامل. أو ملف بدون امتداد - سيتم إرجاع الاسم نفسه.
هذه الطريقة تستحق