language - php mysql



لماذا هو{${0} صحيح؟ (4)

بادئ ذي بدء ، 0x0 هي مجرد 0 في التمثيل السداسي العشري والتي يتم تحويلها إلى السلسلة '0 " عند استخدامها مع بناء جملة متغير متغير:

var_dump(0x0===0); // prints "bool(true)"

${0x0} = 'test';
echo ${0x0}; // prints "test"
echo ${'0'}; // prints "test" as well
var_dump(get_defined_vars()); // contains ["0"] => string(4) "test"

أنت صحيح مصل الحليب تقول أنه ليس اسم متغير صالح :

تتبع الأسماء المتغيرة القواعد نفسها التي تتبعها التسميات الأخرى في PHP. يبدأ اسم متغير صالح بحرف أو شرطة سفلية ، متبوعًا بأي عدد من الحروف أو الأرقام أو الشرطة السفلية. كتعبير عادي ، يتم التعبير عنها هكذا: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'

هذا هو السبب في أن $0foo = 'Test'; يطلق خطأ تحليل.

تكشف بعض الاختبارات السريعة بناء جملة المتغيرات المتغيرة ، في الواقع ، أن PHP لا يبدو أنها تهتم حقًا بأسماء المتغيرات بقدر ما هي سلاسل:

${'123 abc xyz    '} = 'Test';
echo ${'123 abc xyz    '}; // Test
echo ${'123 abc xyz   '}; // PHP Notice:  Undefined variable: 123 abc xyz    in ...
var_dump(get_defined_vars()); // ["123 abc xyz    "] => string(4) "Test"

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

تتكون متغيرات PHP ، بشكل عام ، من أمرين: التسمية ، والتي قد تكون ، على سبيل المثال ، إدخالًا في جدول الرموز والحاوية المتغيرة الفعلية.

بقدر ما يتلقى سلسلة صالحة للتسمية ، فإنه سعيد.

https://ffff65535.com

الكود التالي يعمل بشكل ممتاز:

${0x0} = 'test';
echo ${0x0}; // prints "test"

لكن لا يمكنني معرفة السبب. 0x0 (أو 0 ، كما يسميها الأشخاص غير السداسيون) عبارة عن حاوية عشوائية ، يمكن أن تكون أي رقم ، ولكن لا يمكن أن تبدأ متغيرات php برقم. ما هو خاص حول { } المستخدمة هنا ، وما هي حدودها؟


علاوة على ما قالهMichael Robinson ، في هذا المثال ، سيكون هذا صحيحًا أيضًا:

${0x0} = 'test';
$var = "0";
echo $$var; // prints "test"

وبعبارة أخرى ، كل شيء داخل الأقواس المعقوفة في مثل هذه الحالات هو سلسلة!

لذا s 0x0 هو في الحقيقة إصدار سداسي عشرية ولكن 0 كلاهما سلاسل! وهذا هو السبب وراء عمل ${0x0} أو ${0} ، حيث لن يعمل $0 أو $0x0 !


يوفر محلل PHP بناء جملة خاصًا لإنشاء اسم متغير من أي تعبير يُرجع السلسلة (أو يمكن تحويله إلى سلسلة) ، على سبيل المثال:

<?php

define('A', 'aaa');

${'    _   '} = 'blah';
${'test' . A . (2 + 6)} = 'var';

echo ${'    _   '}; // blah
echo ${'testaaa8'}; // var

${'123'} = 'blah';
echo ${100 + 23}; // blah

function returnVarName() {
    return 'myVar';
}

$myVar = 12;
echo ${returnVarName()}; // 12

بناء الجملة هذا متاح أيضًا لخصائص الكائن:

$object->{' some property    ... with strage name'};

0x0 هو مجرد تمثيل ست عشري لـ 0 حرفي.





php