لماذا يحقدون على PHP ؟!

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

ولكن هل هذه الإتهامات لها ما يبررها ؟ أم أنها حالة طبيعية تجاه أي تقنية أو منتج تصدر المشهد لسنوات طويلة ؟

سأجيب على هذه الأسئلة وغيرها في هذه التدوينة التي سأحاول الوقوف فيها على الحياد بين طرفي النزاع 😅

كيف بدأ PHP ؟

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

تطور العمل على ذلك المشروع وتم جعله مفتوح المصدر حتى وصل إلى الإصدار الثاني الذي حمل الإسم PHP/FI (اختصار ل Personal Home Page/Forms Interpreter). كان ذلك في أواخر 1997.

<!--include /text/header.html-->

<!--getenv HTTP_USER_AGENT-->
<!--ifsubstr $exec_result Mozilla-->
  Hey, you are using Netscape!<p>
<!--endif-->

<!--sql database select * from table where user='$username'-->
<!--ifless $numentries 1-->
  Sorry, that record does not exist<p>
<!--endif exit-->
  Welcome <!--$user-->!<p>
  You have <!--$index:0--> credits left in your account.<p>

<!--include /text/footer.html-->

الكود أعلاه عينة مما كان عليه الوضع مع PHP/FI 2، وتلاحظون كيف أن HTML ممزوج مع كود الخادم. إلى اليوم مازالت هذه الخاصية مطبوعة في الحمض النووي الخاص للغة البرمجة PHP. ولعلها من المزايا التي تعجب المبتدئين وتجذبهم نحو هذه اللغة، وهي في نفس الوقت من المبررات التي يستخدمها الكارهون لإعتقادهم أن PHP لم تتخلص إلى وقتنا الحاضر من إرث راسموس ليدرورف وتلك البداية الغير مثالية.

هل PHP لغة برمجة للمبتدئين ؟

يتميز PHP بكونه لغة برمجة في متناول المبتدئ الذي يريد أن يشرع ففي بناء أولى صفحاته في الويب. هذه اللغة كما رأينا في الفقرة السابقة تستطيع مزجها بلغة HTML التي تعتبر أول ما يتعلمه أي مطور يريد البدء في مجال الويب.

هذه الميزة تجعل PHP يبدو وكأنه محرك قوالب (Template Engine). فكل ما عليك فعل لتحويل صفحة ساكنة إلى صفحة ديناميكية هو تحويل امتدادها من .html إلى .php واستبدال النصوص والعناصر الساكنة بأكواد PHP الديناميكية.

<!DOCTYPE html>
<html>
  <head>
    <title>Hello, World!</title>
  </head>
  <body>
    <h1>
      <?php echo 'Hello, World!'; ?>
    </h1>
  </body>
</html>

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

من جهة أخرى، لا أحد ينكر بأن PHP تطور كثيرا في السنوات الأخيرة وأخذ يعتنق شيئا فشيئا مبادئ البرمجة كائنية التوجه، تحديدا منذ الإصدار 5.0 الذي يراه كثيرون البداية الحقيقية ل PHP كلغة برمجة حقيقية. منذ ذلك الحين شهدنا إدخال مزايا متعددة ومهمة مثل Namespaces، Traits، Interfaces و OpCache الذي حسن كثيرا من أداء وسرعة هذه اللغة.

هل PHP لغة بطيئة ؟

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

قبل الإصدار 5.5 كانت PHP ومع كل طلب (Request) تقوم بقراءة مجموع الملفات المتعقلة بذلك الطلب ثم تفسرها(Interpret) وتحللها (parse) لتوليد ما يعرف بِ OpCode. هذا الأخير هو ما يتم تنفيذه على مستوى الخادم من طرف Zend Engine.

هذه العملية تنطوي على بعض الصعوبات والسلبيات المتعلقة بالأداء والسرعة، حيث أنه في كل مرة يتم تكرار نفس العملية (قراءة، تحليل، تفسير، توليد OpCodes) ما يؤثر على سرعة تنفيذ البرنامج.

مع وصول إصدار PHP 5.5 في عام 2013، تم اتخاذ خطوة مهمة للغاية للتغلب على تلك الصعوبات مع بروز OpCache extension. دور هذا الإمتداد كما هو واضح من الإسم عمل Cache للشفرة البرمجية المفسرة وبالتالي لا يكون هناك داعي لقراءة وتحليل سكريبتات PHP مع كل Request.

PHP OpCache

في الحقيقة، طبيعة PHP من حيث كونها Dynamically Typed Programming Language تجعلها أقل سرعة أو أبطأ من لغات البرمجة من الصنف المقابل، أي Statically Typed. والسبب الأول أن أنواع المتغيرات يتم التأكد منها في مرحلة تشغيل الكود (Run-time) عوض مرحلة الترجمة (Compiling Time) مثلما يحدث عند لغات الصنف الثاني. النتيجة هي أن لغة مثل جافا (Static Typing) ستكون أسرع بشكل واضح من PHP في Run-time.

لمحاولة التغلب على هذه الثغرة ظهر حلول طرف ثالث لإضافة ميزة مثل Just-in-time Compilation إلى PHP. أشهر مثال هو مشروع HHVM من فيسبوك الذي استبق نوايا مؤسسة Zend لإضافة خاصية JIT Compilation إلى الإصدار الثامن من PHP المرتقب وصوله نهاية العام الجاري إذا صارت الأمور على ما يرام.

لغة برمجة غير منسجمة

من النقاط والسلبيات التي لا يمكننا إلا أن نتفق حولها حقيقة أن PHP لغة برمجة غير منسجمة (Inconsistent) من ناحية تركيبها (Syntax) وطريقة الكتابة، وكذلك وجود أكثر من طريقة للقيام بالأمر ذاته.

على سبيل المثال، يمكننا عمل اتصال مع خادم قاعدة البيانات بطريقتين مختلفتين: PDO و mysqli. الطريقة الأولى هي الأحدث والموصى بها. مع ذلك مازال البعض يستعمل الطريقة الثانية لأنها تظل مدعومة من PHP لأغراض متعلقة بالتوافق مع الإصدارات السابقة.

PHP تولي أهمية بالغة ل Backward Compatibility ولكن الإفراط في هذا التوجه أدى لظهور العديد من الإلتباسات من هذا النوع، بالخصوص في وجه المبتدئين الذين لا يعلمون بالتحديد أي الطرق يسلكون.

كذلك، من أعراض عدم انسجام لغة البرمجة PHP مع نفسها ما نلاحظه في بعض الدوال أو الوظائف التي تقوم بأدوار متقاربة ولكنها تعمل بطرق مختلفة وغير بديهية. مثلا الدالة arrray_filter، التي تمكننا من فلترة المصفوفة، تقبل في البارامتر الأول المصفوفة المراد فلترتها وفي البارامتر الثاني دالة callbackحيث يجري منطق الفلترة. وفي مثال آخر لدالة مشابهة - array_map - نجد أن البارامتر الأول هو الـ callback والبرامتر الثاني هو المصفوفة!

array_filter($array, $callback);
array_map($callback, $array);

حتى في تسمية الدوال هناك عدم تناسق واضح، فمثلا في بعض دوال التحويل يتم استعمال الكلمة to بينما في دوال أخرى يستعمل الرقم 2. نفس الكلام يقال عن إدخال رمز _ في أسماء بعض الدوال وعدم استعماله في دوال أخرى.

// Usage of: _ vs nothing
base64_encode() vs urlencode()

// Usage of : 2 vs to
bin2hex() vs strtolower()

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

لا ننسى كذلك استعمال رمز النقطة . في عمل Concatenation للنصوص بينما يستعمل الرمز + في جمع الأعداد. وهنا يتضح جليا تأثر PHP بلغة Perl وإلا فإن الغالبية الساحقة من لغات البرمجة التي أعرفها تستعمل نفس الرمز + سواء لجمع الأعداد أو لعمل Strings Concatenation.

نفس الكلام يمكن قوله عن استعمال الرمز -> للوصول إلى وظائف وخاصيات الكائنات.

الخلاصة من كل هذا الكلام، إذا كنت تنوي بدء مسيرتك مع PHP فكن مستعدا أن تقضي جزءًا كبيرا من وقتك جيئة وذهابا من وإلى التوثيق الرسمي.

PHP ليست أكثر اللغات انسجاما وبداهة.

ضريبة النجاح ؟

هناك مقولة مشهورة لعالم الحاسوب ومصمم لغة البرمجة C++ بيارن ستروستراب، تقول: "هناك نوعان فقط من لغات البرمجة: لغات يشتكي منها الناس ولغات لا أحد يستعملها !"

There are only two kinds of languages: the ones people complain about and the ones nobody uses! - Bjarn Stroustrup

أعتقد أن PHP مثال حي واقعي على هذه المقولة، ربما نجاح هذه اللغة وسيطرتها على مجال نشاطها هو الذي أدى بالناس إلى البحث عن نقاط ضعفها والنواحي التي لا تؤدي فيها بشكل جيد، أو لم تصمم من أجلها. وهل هناك أصل لغة برمجة مثالية ؟ لا أظن ذلك على حسب معرفتي المتواضعة.

مما لا شك فيه أن لغة البرمجة PHP حقق من النجاح ما لم تحققه اللغات الأخرى في ميدان خوادم الويب، حتى أن الكثير من الإحصائيات أكدت على أن الفيل الأزرق يسيطر على 80% من شبكة الإنترنت. ووردبريس وحده يدعم ما يربو على 30% من مجموع المواقع على الشبكة العنكبوتية! حتى أن كلمة "مدونة" أو "Blog" أصبحت مرتبطة مباشرة بنظام إدارة المحتوى ووردبريس.

مواقع كبيرة اليوم تعتمد كذلك على PHP بشكل جزئي أو كلي، منها فيسبوك، ويكيبيديا، تامبلر، مايل شمب، بايدو إلخ... وهذا دليل على أن هذه اللغة يمكن كذلك أن تؤدي الغرض في البيئات الأكثر تنافسية والتي تتطلب درجة كبيرة من الأداء.

هل PHP تحتضر ؟

في كل مرة تخرج إلينا تقنية جديدة يقول بعض المتحمسين إن التقنيات التي قبلها ستموت وتندثر.. هكذا قيل في PHP مع ظهور Node.js وهكذا يقال الآن عن الأخير مع ولادة Deno!

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

العديد من التهم التي كانت تقذف بها PHP أصبحت من الماضي، ولكن البعض ما يزال مصرا على ترديدها سواء عن قصد أو عن جهل.

الوصمة القديمة عن كون PHP لغة بطيئة لم تعد موجودة كما بيَّننا منذ لحظات، بل إن الفيل الأزرق 🐘 أثبت في بعض التجارب أنه أسرع من أفعى بايثون وألمع من جوهرة روبي 😃 والكلام القديم عن التنويع (Typing) لم يعد بتلك الأهمية بعد التقدم الواضح الذي شهدناه في السنوات الأخيرة مع مزايا مثل Scalar Type Hints و Typed Properties التي توضح لنا أن PHP تستمع جيدا للإنتقادات البناءة الموجهة إليها وأن هناك عمل لتحسين ما يمكن تحسينه.

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

هذه التقنيات أعطت جمالا ورونقا وقوة إضافية لعالم PHP وشكلت قوة ناعمة سيطرت من خلالها تلك اللغة على أجزاء واسعة من السوق.

في الختام

مما لا شك فيه أن PHP ليست لغة البرمجة الأفضل من حيث أدائها ولا الأجمل من حيث التصميم، ولكن المؤكد أنها تقوم بعملها كما يجب في مجال تخصصها وهو توليد صفحات والويب ودعم خوادم الويب.

ما يهمنا كمطورين معرفته أن نتعلم كيفية اختيار الأدوات المناسبة للقيام بمهام محددة. هناك بعض الحالات التي يعمل فيها Node.js مثلا أفضل من PHP وهناك الحالات التي يستحسن فيها اللجوء للأخير، وهناك منطقة رمادية حيث يمكن الإستفادة من كليهما في ذات الوقت.

المسألة كلها متعلقة باحتياجات المشروع وطبيعته.

شركة عملاقة مثل جوجل اضطرت إلى تصميم وبناء لغة برمجة خاصة - Go - للقيام بمهام لم تكن لغة مثل C++ قادرة على القيام بها كما أرادت جوجل. المشكل ليس في C++، فالجميع يعرف مدى قوة هذه اللغة وكونها لغة مرجعية بنيت عليها وحولها تقنيات وبرامج عملاقة نستعمل الكثير منها يوميا.

كل ما هناك أن جوجل صادفت بعض الحالات التي اتضحت فيها بعض من أوجه قصور C++ مثل Concurrency و Build Time لم تظهر إلا في شركة مثل Google تقوم باستقبال وتحليل بيانات المليارات من المستخدمين وصفحات الويب على الإنترنت، ما يعني ملايين الأسطر البرمجية التي يجب التعامل معها بشكل أو بآخر.

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

المسألة بهذه البساطة 😄

يهمني سماع رأيك 👇


مراجع مهمة للإستزادة: