سؤال

معالج C++ المسبق #define مختلف تماما.

هل PHP define() هل يختلف عن مجرد إنشاء var؟

define("SETTING", 0);  
$something = SETTING;

ضد

$setting = 0;  
$something = $setting;
هل كانت مفيدة؟

المحلول

عملية 'تعريف' نفسها بطيئة إلى حد ما - تم تأكيدها بواسطة ملف التعريف xdebug.

وهنا المعايير من http://t3.dotgnu.info/blog/php/my-first-php-extension.html:

  • "تحديد" نقي
    380.785 عملية جلب/ثانية
    14.2647 يعني ميلي ثانية/الاستجابة الأولى

  • الثوابت المحددة بامتداد "hidef".
    930.783 عملية جلب/ثانية
    6.30279 يعني ميلي ثانية/الاستجابة الأولى


تحديث الرابط المكسور

لقد غادر منشور المدونة المشار إليه أعلاه الإنترنت.لا يزال من الممكن مشاهدته هنا عبر آلة Wayback.وهنا آخر مقالة مماثلة.

المكتبات التي يمكن العثور على مراجع المؤلف فيها هنا (apc_define_constants) و هنا (امتداد إخفاء).

نصائح أخرى

بشكل عام، فكرة الثابت هو أن يكون ثابت, ، (يبدو مضحكا، أليس كذلك؟;)) داخل الخاص بك برنامج.مما يعني أن المترجم (المترجم) سيستبدل "FOOBAR" بقيمة FOOBAR خلال البرنامج النصي بأكمله.

الكثير من الناحية النظرية والمزايا - إذا قمت بتجميعها.أصبحت PHP الآن ديناميكية جدًا وفي معظم الحالات لن تلاحظ اختلافًا لأنه يتم تجميع برنامج PHP النصي مع كل عملية تشغيل.Afai-can-tell يجب ألا ترى اختلافًا ملحوظًا في السرعة بين الثوابت والمتغيرات إلا إذا كنت تستخدم ذاكرة تخزين مؤقت لرمز البايت مثل ناقلة جنود مدرعة, محسن زيند أو eAccelerator.ثم يمكن أن يكون له معنى.

جميع المزايا/العيوب الأخرى للثوابت قد تم ذكرها هنا بالفعل ويمكن العثور عليها في دليل PHP.

php > $cat='';$f=microtime(1);$s='cowcow45';$i=9000;while ($i--){$cat.='plip'.$s.'cow';}echo microtime(1)-$f."\n";

0.00689506530762

php > $cat='';$f=microtime(1);define('s','cowcow45');$i=9000;while ($i--){$cat.='plip'.s.'cow';}echo microtime(1)-$f."\n";

0.00941896438599

هذا قابل للتكرار مع نتائج مماثلة.يبدو لي أن الثوابت أبطأ قليلاً في التعريف و/أو الاستخدام من المتغيرات.

وهنا الاختلافات، من يدوي

  • لا تحتوي الثوابت على علامة الدولار ($) قبلها؛
  • لا يجوز تعريف الثوابت إلا باستخدام الدالة Define()، وليس عن طريق مهمة بسيطة؛
  • يمكن تعريف الثوابت والوصول إليها في أي مكان دون النظر إلى قواعد تحديد النطاق المتغيرة؛
  • لا يجوز إعادة تعريف الثوابت أو عدم تعريفها بمجرد تعيينها؛و
  • لا يمكن تقييم الثوابت إلا بالقيم العددية.

بالنسبة لي، الفائدة الرئيسية هي النطاق العالمي.أنا بالتأكيد لا أقلق بشأن كفاءتها - استخدمها عندما تحتاج إلى قيمة عددية عالمية لا ينبغي تغييرها.

لا تبدو فعالة.(وأنا أبني كل الافتراضات هنا على تعليق واحد من php.net، وما زلت لم أقم بإجراء المعايير بنفسي.)

استدعاء ثابت، سوف يستغرق 2x وقت استدعاء المتغير.

سيستغرق التحقق من وجود الثابت 2 مللي ثانية و12 مللي ثانية للحصول على نتيجة إيجابية خاطئة!

إليك معيارًا من تعليقات صفحة التعريف في مستند php عبر الإنترنت.

قبل استخدام المحدد()، قم بإلقاء نظرة على المعايير التالية:

true                                       0.65ms
$true                                      0.69ms (1)
$config['true']                            0.87ms
TRUE_CONST                                 1.28ms (2)
true                                       0.65ms
defined('TRUE_CONST')                      2.06ms (3)
defined('UNDEF_CONST')                    12.34ms (4)
isset($config['def_key'])                  0.91ms (5)
isset($config['undef_key'])                0.79ms
isset($empty_hash[$good_key])              0.78ms
isset($small_hash[$good_key])              0.86ms
isset($big_hash[$good_key])                0.89ms
isset($small_hash[$bad_key])               0.78ms
isset($big_hash[$bad_key])                 0.80ms

PHP الإصدار 5.2.6، أباتشي 2.0، ويندوز XP

تم تنفيذ كل عبارة 1000 مرة ، وبينما لن يكون هناك 12000 مكالمة في 1000 مكالمة لن يقوم المستخدمون النهائيون بتمزيق شعرهم ، إلا أنه يلق بعض النتائج المثيرة للاهتمام عند المقارنة إذا (صحيح):

1) إذا كان ($ true) متطابقًا تقريبًا 2) إذا كان (true_const) كان بطيئًا تقريبًا - أعتقد أن الاستبدال لم يتم في وقت الترجمة (اضطررت إلى التحقق من هذا!) 3) محدد () 3 مرات أبطأ في حالة وجود الثابت 4) المحدد () أبطأ 19 مرة إذا لم يكن الثابت موجودًا!5) ISSET () فعال بشكل ملحوظ بغض النظر عن ما ترميه (أخبار رائعة لأي شخص يقوم بتنفيذ أنظمة الأحداث التي تحركها الصفيف - أنا!)

قد ترغب في تجنب إذا (محدد('DEBUG'))...

من tris+php في tfconsulting dot com dot au 26 مارس 2009 06:40

http://us.php.net/manual/en/function.define.php#89886

التعريف هو إحساس ثابت بسيط، مما يعني أنه لا يمكن تغيير قيمته أثناء وقت التشغيل بينما المتغير هو إحساس ديناميكي لأنه يمكنك التعامل مع قيمته بحرية طوال العملية.

الاختلافات الرئيسية:

  • التعريف ثابت، المتغير متغير
  • أنها مختلفة النطاق/الرؤية

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

لست متأكدًا من الكفاءة، لكنه أكثر من مجرد إنشاء متغير:

  • وهو ثابت:لا يمكنك إعادة تعريف أو إعادة تعيين هذا الإعداد.
  • إذا لم يتم العثور على التعريف، فسيتم تعيين $something على "SETTING"، وهو أمر مفيد، على سبيل المثال، في i18n:إذا كانت الترجمة مفقودة (أي.التعريف المقابل هو ملف الترجمة)، نرى كلمة كبيرة مكتوبة بأحرف كبيرة، واضحة تمامًا...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top