سؤال

لقد قمت بالترقية فقط إلى PHP 5.3 وبدأت بدعم موقع الويب القديم لعميل جديد. يبدو أنه يستخدم رمز PHP الفردي الذي لم أصل إليه من قبل.

أثناء محاولة الوصول إلى متغيرات $ _О _REQUEST، استخدم المطور ما يلي: $ {"variable_name"}

أحصل على إشعارات تم إنشاؤها بسبب المتغيرات غير المحددة (من المفترض أن PHP ليس تحليل $ {"variable_name"} كود نمط).

تغيير هذا إلى $ _REQUEST ['variable_name' يعمل كما هو متوقع، لكنني لا أستطيع أن أذهب من خلال كودها وتغييره كما هو الموقع ضخمة ويستخدم أساليب تخطيط Proprietry.

هل يعرف أحد إذا كان من الممكن تبديل الدعم لهذه العلامات / CodeBlocks؟ لقد ألقيت نظرة على PHP.INI وهناك ذكر علامات أسلوب ASP والعلامات القصيرة ولكن تمكين هذه ليست لها تأثير (تبدو مختلفة تماما على أي حال، فقد اعتقدت للتو أن الأمر يستحق رصاصة).

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

المحلول

لا أعتقد أن هناك أي شيء جديد بهذا بناء الجملة:

$a = 10;
var_dump(${"a"});

يعمل بشكل جيد فقط ؛-)


ربما تكون المشكلة ربما بسبب حقيقة ذلك، من قبل، register_globals تم تمكينه (بشكل افتراضي، إذا كان PHP <= 4. شيء), ، وهي تعطيل الآن - وهذا أمر جيد للأمن!

مع changer_globals تم تعيينها على، أي متغير في $_REQUEST يتم حقن تلقائيا كخابرة في التطبيق الخاص بك - حسنا، في الواقع، هذا يعتمد على variables_order خيار التكوين، ولكن هذا واحد تقريبا يشمل دائما الحصول على والبريد والملفات تعريف الارتباط على الأقل.

على سبيل المثال، إذا كان هناك متغير مثل $_GET['my_var'], ، سيكون لديك أيضا $my_var متغير ... ويمكن أيضا الوصول إلى هذا مع بناء الجملة ${'my_var'}


مع مراعاة register_globals يكون Off افتراضيا منذ شيء مثل PHP 4.2، وينبغي أن تختفي في PHP 6 (إذا كنت أتذكر بشكل صحيح), ، أود أن أنصح بإعادة تنشيطها ... على الأقل، إذا كان لديك الوقت اللازم لتصحيح / اختبار الرمز ...

نصائح أخرى

بناء جملة Brace مجعد للمتغيرات جزءا لا يتجزأ من PHP، وكان حوله لفترة طويلة. السبب في أنه موجود هو حل الغموض مع صفائف ومتجميعات الكائنات عند استخدامها المتغيرات المتغيرة.

من الدليل:

من أجل استخدام المتغيرات المتغيرة مع صفائف، يجب عليك حل مشكلة الغموض. وهذا هو، إذا كنت تكتب $$1 ثم يحتاج المحللون إلى معرفة ما إذا كان من المفترض أن تستخدم $ A1 كمتغير، أو إذا كنت تريد $$ A كمتغير ثم 1 مؤشر من هذا المتغير. بناء الجملة لحل هذا الغموض هو: $ {$ A1} للحالة الأولى و {$ A}1 للمرة الثانية.

إنه بناء جملة مفيد للغاية في العديد من المواقف، مثل استخدام المتغيرات الصفيف أو الكائنات أثناء إخراج شيء باستخدام بناء جملة HEREDOC..

لن أؤكد من جديد النصيحة من قبل الآخرين حول استخدام register_globals, أردت فقط أن أتعرض على بناء الجملة غير العادي.

بناء جملة $ {"variable_name"} هو نفسي نفس couariable_name $، إلا أن محتويات الأقواس المجعد يتم تقييمها أولا. وهي مدعومة من قبل جميع الإصدارات الحديثة من PHP، حتى إصدارات بيتا. ما لا يدعمه الإصدارات الحديثة من PHP هو دعم تسجيل المتغيرات $ _REQUEST (وغيرها) مثل المتغيرات العالمية. هناك إعداد لتمكينه:

register_globals = on

لا ينصح باستخدام الإنتاج بسبب مشكلات الأمان رغم ذلك. قد يكون من الأسهل تشغيله مصدرا من خلال بعض "أداة مثل Sed'-chould واستبدالها بالتعبير العادي.

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

REGISTER_GLOBALS يضع كل المتغيرات في $_REQUEST كمتغيرات منتظمة في النطاق العالمي، مما يعني أنه يمكنك الوصول $_REQUEST['test'] يمكن الوصول إليها مثل $test أو ${"test"}

بناء جملة قوس في الافتراضي، ولا أصدق أنه يمكنك تشغيل / إيقاف تشغيله.

register_globals كان من المرجح أن تحول. {$variable_name} بناء الجملة دائما، ولكن register_globals يتحول أشياء مثل $_REQUEST['variable_name'] إلى $variable_name.

تجنب تبديله إذا كان ذلك ممكنا، على الإطلاق - هناك سبب ينصح طويلا ضده، وهو يذهب بعيدا تماما في PHP6.

register_globals يتم إهماله اعتبارا من PHP 5.3 وسيتم إزالته اعتبارا من PHP 6.0. ما تريد القيام به هو استخدام ميزة Refactoring الموجودة في معظم PHP IDE (ZenDo Studio 6+ Zendo 6+) لإعادة تسمية المتغير إلى شيء أكثر ملاءمة، أي $_GET['variable_name'].

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