خطأ T_PAAMAYIM_NEKUDOTAYIM في PHP: ما هو وكيفية إصلاحه

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

هل واجهت الخطأ الغامض T_PAAMAYIM_NEKUDOTAYIM؟ لا تقلق!

\n\n

إذا كنت قد كتبت كود PHP من قبل ورأيت رسالة خطأ مثل PHP Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)، فأنت تعلم كم هي محبطة. خاصة عندما تكون مبتدئًا وتظهر لك كلمة غريبة بالعبرية. في الحقيقة، هذا الاسم الطويل يخفي شيئًا بسيطًا — إنه عامل نطاق الرؤية (Paamayim Nekudotayim تعني "النقطتان المزدوجتان" بالعبرية).

\n\n

في هذا الدليل، سنشرح لماذا يحدث هذا الخطأ، وكيفية إصلاحه، وكيف تتجنبه في المستقبل. المقال مبني على سؤال حقيقي من Stack Overflow حصل على آلاف المشاهدات — مما يعني أن المشكلة شائعة حقًا.

\n\n

ما هو T_PAAMAYIM_NEKUDOTAYIM؟

\n\n

في PHP، هناك عامل خاص :: (النقطتان المزدوجتان). يُستخدم للوصول إلى الخصائص الثابتة (static properties) والطرق الثابتة (static methods) والثوابت (constants) داخل الكلاس. مثال:

\n\n
<?php\nclass MyClass {\n    public static $value = 42;\n    const PI = 3.14;\n    \n    public static function hello() {\n        return "مرحبًا من الدالة الثابتة!";\n    }\n}\n\n// الاستخدام الصحيح لـ ::\necho MyClass::$value;  // سيظهر 42\necho MyClass::PI;      // سيظهر 3.14\necho MyClass::hello(); // سيظهر "مرحبًا من الدالة الثابتة!"\n?>\n
\n\n

الأمر بسيط، طالما أنك لا تخالف قواعد الصياغة. يظهر خطأ T_PAAMAYIM_NEKUDOTAYIM عندما يجد PHP :: في سياق غير متوقع أو عندما يكون ما قبلها ليس كلاسًا بل شيئًا آخر (مثل متغير).

\n\n

أكثر 5 أسباب شيوعًا للخطأ

\n\n

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

\n\n

1. استخدام :: مع كائن (object) بدلاً من الكلاس

\n\n

الخطأ الأكثر شيوعًا للمبتدئين — محاولة استدعاء دالة ثابتة عبر كائن باستخدام :: بدلاً من ->.

\n\n

خطأ:

\n
<?php\nclass Calculator {\n    public static function add($a, $b) {\n        return $a + $b;\n    }\n}\n\n$calc = new Calculator();\necho $calc::add(5, 3); // خطأ! PHP يتوقع T_PAAMAYIM_NEKUDOTAYIM\n?>\n
\n\n

صحيح:

\n
<?php\necho Calculator::add(5, 3); // استدعاء عبر الكلاس\n// أو إذا كانت الدالة غير ثابتة:\n// echo $calc->add(5, 3);\n?>\n
\n\n

تذكر القاعدة: للدوال والخصائص الثابتة استخدم :: مع اسم الكلاس، وللدوال العادية استخدم -> مع الكائن.

\n\n

2. نسيان تعريف الكلاس أو خطأ في اسمه

\n\n

أحيانًا تكتب :: لكن PHP لا يجد الكلاس لأنك لم تعرفه أو أخطأت في كتابة اسمه.

\n\n

مثال على الخطأ:

\n
<?php\necho SomeClass::doSomething(); // Fatal error: Class 'SomeClass' not found\n?>\n
\n\n

كيف تصلحه:

\n
    \n
  • تأكد من أن الكلاس معرف (أو مستورد عبر require/include).
  • \n
  • تحقق من كتابة اسم الكلاس بدون أخطاء إملائية.
  • \n
  • إذا كان الكلاس في ملف آخر، تأكد من صحة المسار.
  • \n
\n\n

3. استخدام :: مع متغير لا يحتوي على اسم كلاس

\n\n

أحيانًا تحاول الوصول إلى دالة ثابتة عبر متغير، لكن المتغير لا يحتوي على نص (string) باسم الكلاس، بل شيء آخر.

\n\n

الكود المشكل:

\n
<?php\nclass Logger {\n    public static function log($msg) {\n        echo "[LOG] $msg";\n    }\n}\n\n$className = 123; // هذا رقم وليس نصًا باسم الكلاس\n$className::log("اختبار"); // خطأ!\n?>\n
\n\n

الحل: تأكد دائمًا أن المتغير يحتوي على اسم كلاس صحيح (نص).

\n\n
<?php\n$className = 'Logger';\                

المدونات

توصيات الكتب