كيف يعرف PHP نوع المتغيرات التي يستخدمها (أو تفعل ذلك)؟

StackOverflow https://stackoverflow.com/questions/4039542

سؤال

لم أفعل الكثير من البرمجة في العديد من اللغات ، لكنني أعلم في C (++) ، عليك أن تعلن نوعًا متغيرًا (int,char،إلخ).

في PHP ، بالطبع ، لست مضطرًا للقيام بذلك. يمكنك البدء مع $str = "something"; ثم في وقت لاحق $str = array("something" => "smells"); وهي سعيدة.

كيف يجمع PHP؟ كيف يعرف ما هو النوع المتغير؟ هل تهتم حتى؟

هذا السؤال ليس له صلة بأي شيء أقوم به. مجرد فضول.

تعديل.

أحتاج إلى توضيح هذا السؤال قليلاً.

في C ، إذا قلت:

int y;

يحتفظ بمقدار x من البايتات y. لو y تدفق ، أخبار سيئة.

PHP ليس لديه هذه الطبيعة (على الأقل لا أعتقد أنها كذلك).

$i = "a number";
$i = 8;
$i = 1000000000000000000;

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

هل كانت مفيدة؟

المحلول

نظرًا لأن لديك خبرة C ، فكر في متغير PHP ليكون مثل ما يلي:

typedef struct {
 int varType;
 void* data;
} variable_t;

عند إنشاء متغير جديد ، سيقوم بإنشاء ملف variable_t, ، أعطها علامة نوع (دعنا نقول 1 لـ int ، 2 للسلسلة) ، وتخزينها في قائمة في مكان ما (حسب النطاق ، المرجع بالاسم). سيتم تخزين المحتويات الفعلية في *data. عندما يتم الوصول إلى المتغير مرة أخرى ، يمكن تحديد النوع من int varType, واتخاذ الإجراءات المعنية void* data, ، مثل استخدامه كـ int أو سلسلة.

تخيل أن مقتطف PHP:

 $data = 12;
 $data2 = $data + 1;
 $data = "Hello";

ينتج تعليمات مثل ما يلي (pseudo-cish):

Line 1:
variable_t* var = new_variable(TYPE_INT, data);
store_variable("data", var);

Line 2:
variable_t* var = get_variable("data2");
if (var->varType == TYPE_INT)
   int value = 1 + *(int*)var->data);
else
   error("Can't add non int");
var = new_variable(TYPE_INT, value);
store_variable("data2", var);

Line 3:
variable_t* var = get_variable("data");
if (var)
  destroy_variable(var);
// Do like line 1, but for TYPE_STRING

يعمل هذا النوع من البيانات المعززة في اللغات المدمجة أو المترجمة أو المباشرة.

هناك المزيد من التفاصيل فيما يتعلق بتطبيقات الماكينة الظاهرية المختلفة (التخصيص المحلي ، تخصيص الكومة ، تسجيل VMs ، إلخ). إذا كنت تريد فعلاً أن تفهم كيفية عمل الأجهزة الافتراضية ، فإن أفضل مرجع هو لوا. لغة نظيفة للغاية ، و bytecode نظيفة للغاية ، وجهاز افتراضي نظيف للغاية. ربما يكون PHP هو آخر تطبيق يجب أن تنظر إليه.

نصائح أخرى

PHP لا يتجمع حقًا-يتم تفسيره (في الرسوم البيانية).

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

لا يجمع. إنه ل اللغة المفسرة, ، مثل جافا سكريبت.

أدرك أن هذا سؤال قديم ولكن إليك بعض المعلومات الأكثر تحديدًا حول كيفية تعامل PHP مع الأسئلة التي طرحها البروتوكول الاختياري.

هذه هي الصفحة من مرجع PHP الذي تريد أن تبدأ بـ:

مقدمة للمتغيرات

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

OP: كيف يعرف PHP نوع المتغيرات التي يستخدمها (أو تفعل ذلك)؟

تم كتابة PHP في C ويستخدم T struct typedef الذي يسميه أ زفال جنبا إلى جنب مع اتحاد C typedef الذي هو المكالمات أ ZVAL_VALUE لتمثيل جميع المتغيرات.

typedef struct _zval_struct {
    zvalue_value value;        /* variable value */
    zend_uint refcount__gc;    /* reference counter */
    zend_uchar type;           /* value type */
    zend_uchar is_ref__gc;     /* reference flag */
} zval;

"يحاول المحرك التستر على تعقيد مفهوم المتغير الذي يمكن أن يكون أي نوع من خلال توفير مجموعة موحدة وبديهية من وحدات الماكرو للوصول إلى الهياكل المختلفة الحقول."

"PHP هي لغة ديناميكية ومكتوبة بشكل فضفاض ، تستخدم نسخًا على الكتابة والعد المرجعية." يعد العد المرجعي والنسخ على الكتاب (البقر) مفهومين قويان يستخدمهما PHP اللذين لن أذهب إليهما هنا ولكنهما يستحقان القراءة.

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

"ZVAL_VALUE هو اتحاد يمكن أن يمثل جميع الأنواع التي قد يحتفظ بها المتغير."

" ... يمكن أن يكون المتغير من نوع واحد ، ويتم تمثيل البيانات المتغيرة بالحقل المناسب في اتحاد ZVAL_VALUE. يحمل Zval نفسه النوع والعدد المرجعي والعلم للإشارة إلى ما إذا كان المتغير مرجعًا."

كيف يجمع PHP؟

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

كيف يعرف ما هو النوع المتغير؟ هل تهتم حتى؟

كما هو موضح بالفعل أعلاه هو محرك PHP "التفضيل لتحويل ، أو إجبار المتغيرات إلى النوع المطلوب في وقت التنفيذ.

"يتم كتابة PHP بشكل ضعيف ، حيث يوفر المحرك وظائف API لتحويل المتغيرات من نوع إلى آخر."

يحتوي المحرك على مجموعة من وحدات الماكرو التي يستخدمها للعمل مع ZVals لتحويل نوع المتغير بحيث لا تضطر عادة إلى التعامل مع ذلك.

إذا كنت تريد أن ترى كيف تبدو Zvals في العمل ، فيمكن إلقائها:

debug_zval_dump($variableName);

"كيف يتجمع PHP؟ كيف يعرف ما هو النوع المتغير؟ هل يهتم حتى؟

هذا السؤال ليس له صلة بأي شيء أقوم به. مجرد فضول."

PHP هي لغة تفسير ولا تجمع.

لا يعرف PHP أي نوع سيكون المتغير ، لأن نوع المتغير يتم تحديده حسب نوع القيمة التي تم تعيينها في المرة الأخيرة لهذا المتغير.

يمكنك ان تفعلها:

$foo = 5;
var_dump($foo);
$foo = "5";
var_dump($foo);
$foo = array();
$foo[] = 0;
$foo[] = 1;
$foo[] = 2;
var_dump($foo);

كما ترون ، كلما تم تعيين قيمة إلى FOO ، قد يتم تغيير النوع.

لا يهتم PHP بنوع المتغير الخاص بك ، لأنه لغة برمجة وليس لها مشاعر.

تعديل:

"أو هل أقارن التفاح بالبرتقال؟"

نعم أنت على حق. هنا يمكنك معرفة المزيد عن اللغة.

EDIT2:

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

قد تكون هذه الروابط مفيدة لك:

http://www.gidforums.com/t-11866.html

http://www.webmaster-talk.com/coding-forum/186350-fundamental-differences-between-php-cc.html

فرق النطاق المتغير بين PHP و C: نطاق الكتلة ليس هو نفسه بالضبط؟

ملاحظة ، يتم تنفيذ PHP على الخادم ، إذا كنت ترغب في إنشاء أحداث عميل ، فإن JavaScript هو اقتراحي.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top