2009-12-03 18 views
18

PHP'de bir işlevi yeniden yazmak istiyorum (mail() işlevini diyelim) ve bundan sonra mail() 'i aradığımda, posta() sürümümü yükleyecek ve varsayılan php'yi değil sürümü. Bu php'de mümkün mü?Bir işlevi php (posta gibi) ile değiştirmek ve başka bir şey yapmak mümkün mü?

Bunu yapmak istememin nedeni, posta() çağrısı yapan binlerce satır kodum var ve bunların tümünü yeniden yazmak istemiyorum.

Ayrıca ileride başvurmak gerekirse, bilgisayar programlamada, böyle bir şey yaparken ne denir?

Teşekkür

+1

Python bilginize, bu işte çok iyidir. PHP değil. – gahooa

+14

@gahooa Kodu yeniden kodlamaktan kaçınmaya çalışıyor, Python'da yeniden yazmayı kolaylaştırmak için hepsini yeniden yazacağından şüpheliyim. –

+3

Mümkün yinelenen [Değiştirilebilir (monkeypatch) PHP fonksiyonlarını değiştirebilir misiniz?] (Http://stackoverflow.com/questions/530649/is-it-possible-to-replace-monkeypatch-php-functions) – outis

cevap

19

İşlevleri geçersiz kılmanıza izin veren bir uzantı var. Hata ayıklama için kullanılmalıdır, ama sanırım bunları ihtiyaçlarınız için kullanabilirsiniz. Bir göz atın:

http://www.php.net/manual/en/function.override-function.php

Bu yorumu okumak emin olun sürümü içinde orijinal işlevi çağırmak istediğinizde: http://no.php.net/manual/en/function.override-function.php#50821

+2

Bu, çalışma setinden daha basit görünüyor. –

+0

teşekkürler. php dilini çok iyi biliyorsunuz. – chris

2

diğer cevaplar özetlenen uzantılarını kullanarak fonksiyon aşırı yükleme denilen ve yerli PHP mümkün değil ama mümkün oluyor. PHP dokümantasyonunun hiç bir şekilde mümkün olmadığını iddia ediyor: source yanlış.

+0

-1 Referans yanlış. Düzenlenmesi gerekiyor. –

+0

@ewan Sayfanın sonuna doğru, "PHP, aşırı fonksiyon yükünü desteklemiyor ya da önceden tanımlanmış fonksiyonları tanımlamak ya da yeniden tanımlamak mümkün değil." –

+0

Tim. Doğru, düzeltilmesi gereken bu. Milan'ın cevabını ve kendinize bakın. –

9

Yönlendirdiğiniz kişi genellikle method overloading olarak adlandırılır. runkit_function_remove() veya runkit_function_redefine() kullanılarak

genellikle PHP tarafından desteklenmeyen olsa da, aslında iç fonksiyonlarını yeniden tanımlamak mümkün (aynı zamanda kullanıcı fonksiyonlar) olabilir. Tabii ki bunu kullanmak için PHP kurulumu üzerinde oldukça fazla kontrole sahip olmanız gerekecek - çünkü PHP ile paketlenmediğinden install the runkit extension'a ihtiyacınız olacak.

Yine, normal bir durum iç fonksiyonları yanı sıra kullanıcı fonksiyonları yılında PHP'de yeniden (veya aşırı) edilemez. Bu durum, bazı dahili işlevlerin bir kullanıcı işleviyle sarılmasının yararını göstermektedir.

+0

dersi öğrenildi. Php'nin aşırı yüklenmemesinin bir sebebi var mı? Faydalı bir araç gibi görünüyor. APD üzerinden çalıştırma seti için – chris

+0

+1. APD çok daha karmaşık görünüyordu (eski fonksiyonu aşırı yükten çağırmak istiyorsanız ya da birden fazla işlevi maymunpatch etmek istiyorsanız birkaç tane hack yapmak zorundasınız) - ve APD'nin çıkış kodunu çıkarıyormuş gibi görünüyordu. php süreci, yani kullanmak isteyebileceğiniz durumlarda hatalar yaratmanıza neden olur (ms. Jenkins'den Antder çalıştıran bir phpunit test vakasında mt_rand() ve time() gibi şeyleri geçersiz kılar). https://github.com/zenovich/runkit, daha yeni PHP sürümleri için bir güncellemedir. –

+3

@Tim, Aşırı yüklenmiyor. Bu geçersiz. – Pacerier

0

Dosyalarınızdaki işlev adını değiştirmek için normal ifadeleri kullanabilirsiniz. Kullandığınız uygulama size kalmış, ancak ovely-pahalı Powergrep'u (tekrar ihtiyacınız olmayacaksa) tavsiye ederim.

(\s+)mail([\s(]+) 

için
$1new_function_name$2 

ve

^mail([\s(]+) 

new_function_name$1 

S yerine regexp-fu'm için orry, boşluklardan VEYA bir ifadede satırın nasıl başladığını bilmiyorum.

+0

Bence bu çoğunu alacaktır '(^ | \ t | \ s | \ {) mail \ s * ((. *?) \)' Bu satırın başlangıcında, bir sekme veya bir Bir kod bloğu için sıkı ise boşluk veya bir açılış küme ayracı. Değiştirme sırasında yeni işlev adının önüne alan eklemeniz gerekir. Ayrıca, kod bloklarınız açılış kaşlı ayraçtan başka bir şeyle başlıyorsa, bunu regex eşlemesinde değiştirmeniz gerekecektir. –

+0

@nickfox: yazdıklarım, son derece dağınık bir üretim kaynağında kullandığım şeydi, bu yüzden alan test edildi ve varsayımlara dayalı değil. – raveren

+0

@Raveren, Bu soruya cevap vermek yerine sorudan kaçınıyor gibi görünüyor. – Pacerier

İlgili konular