سؤال

يمكنك القيام بذلك في بيثون ، ولكن هل من الممكن في PHP?

>>> def a(): print 1
... 
>>> def a(): print 2
... 
>>> a()
2

على سبيل المثال:

<? function var_dump() {} ?>
Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1
هل كانت مفيدة؟

المحلول

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

الحيلة هي أنه يمكنك تعريف داخلي وظيفة PHP داخل مساحة الاسم.إنه استنادا إلى الطريقة PHP لا اسم القرار على وظائف:

داخل مساحة الاسم (قل A\B), المكالمات غير مؤهلين الوظائف يتم حلها في وقت التشغيل.هنا هو كيفية استدعاء الدالة فو() هو حلها:

  1. فإنه يبحث عن وظيفة الحالية من مساحة الاسم:A\B\فو().
  2. تسعى للعثور على وظيفة العالمية فو()

نصائح أخرى

لا، فإنه ليس من الممكن القيام بذلك كما قد تتوقع.

manual :

<اقتباس فقرة>   

وPHP لا تدعم وظيفة الحمولة الزائدة، وليس من الممكن undefine أو إعادة تعريف وظائف أعلن سابقا.

ومع ذلك، يمكنك استخدام runkit_function_redefine و أبناء عمومتها ، ولكنها بالتأكيد ليست أنيقة جدا ...

ويمكنك أيضا استخدام create_function لتفعل شيئا من هذا القبيل:

<?php
$func = create_function('$a,$b','return $a + $b;');
echo $func(3,5); // 8
$func = create_function('$a,$b','return $a * $b;');
echo $func(3,5); // 15
?>

وكما هو الحال مع runkit، فإنه ليس أنيق للغاية، لكنه يعطي السلوك الذي تبحث عنه.

وأنا أدرك هذا السؤال هو قديمة بعض الشيء، ولكن المرقعة هو recently- صدر PHP 5.3 المشروع الذي يدعم إعادة تعريف الدالات المعرفة من قبل المستخدم. رغم ذلك، كما يذكر المؤلف، وسوف تحتاج إلى اللجوء إلى runkit فب-اختبار المساعدين لقرد الأساسية -patch / وظائف المكتبة.

ونوع. انظر http://dev.kafol.net/2008/09 /php-redefining-deleting-adding.html.

وكما ذكر jmikola، المرقعة هو حل جيد إذا كنت تريد إضافة رمز إلى وظيفة.

وهنا مقال عن كيف يعمل: http://phpmyweb.net/2012/ 26/4 / الكتابة وسيلة رهيبة البرنامج المساعد النظام في وفب /

ولأنه يأتي مع بعض التعليمات البرمجية. أعتقد أن النسخة phpmyweb يستخدم رمز أفضل قليلا، لأنه لا يستخدم وحدة التقييم () 'كود د، خليط خلافا. يمكنك تخزين أكواد العمليات عند استخدام وحدة التقييم ().

الجواب المقبول ممتازة!!!أنا فقط إضافة إلى أنه يمكنك وضع الرموز الخاصة بك في مساحة الاسم بين قوسين ثم الافتراضية العالمية-مساحة resetted.

بعض الطرق الأخرى:

1) rename_function($old_name,$new_name)

2) override_function($old_name, $المعلمات, $new_func)

ونادرا ما تستخدم:

3) runkit_function_rename(...)

4) runkit_function_redefine(...)

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