O (monkeypatch) PHP fonksiyonları değiştirmek mümkün mü?

5 Cevap php

Siz Python yapabilirsiniz, ancak PHP mümkün mü?

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

örneğin:

<? function var_dump() {} ?>
Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1

5 Cevap

Bu soru biraz eski olduğunu biliyoruz, ama Patchwork kullanıcı tanımlı işlevler yeniden tanımlanmasını destekleyen bir süre önce yayımlanan PHP 5.3 projesidir. Rağmen, yazar bahseder gibi, maymun-yama çekirdek / kütüphane işlevleri için runkit veya php-test-helpers başvurmak gerekir.

Jmikola belirtildiği gibi bir işlev kodu eklemek istiyorsanız, Patchwork iyi bir çözümdür.

Here's an article about how it works: http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/

Bazı örnek kodu ile gelir. O eval () 'd code, aksine patchwork kullanmak değil çünkü ben, phpmyweb sürümü biraz daha iyi bir kod kullanır düşünüyorum. Eval () kullanırken opcodes önbelleğe alabilir.

Bu bit Geç met, ben sadece PHP 5.3 yana, bir PHP uzantısı kullanmadan içten işlevleri geçersiz aslında mümkün olduğunu işaret etmek istiyorum.

Hüner bir isim alanı içinde dahili bir PHP işlevini yeniden tanımlamak olabilir. PHP fonksiyonları için ad çözümlemesi yapar yolda dayanıyor:

İsim alanı içindeki (A \ B diyelim), niteliksiz fonksiyonları çalışma anında çözümlenir çağırır. İşte foo işlev çağrısı () çözümlenir:

  1. Geçerli isim bir fonksiyonu arar: A \ B \ foo ().
  2. Bu Küresel işlev foo bulmak ve aramaya çalışır ()