PHP fonksiyonu yeniden tanımlanıyor?

7 Cevap php

Ben bir işlevi varsa:

function this($a){
   return $a;
}

Ben işlevini yeniden tanımlamak istiyorsa, onu yeniden kadar basit olurdu?

function this($a, $b){  //New this function
   return $a * $b;
}

7 Cevap

Bir Java anlamda aşırı yükleme demek, o cevap hayır, bu mümkün değil mi.

Alıntı PHP manual on functions:

PHP işlevi desteklemediği gibi, ne de önceden ilan işlevleri tanımsız ya da yeniden tanımlamak mümkündür.

Sen runkit uzantısı ama üretim senaryolarında runkit kullanımını kullanabilirsiniz genellikle şüpheli uygulama olarak kabul edilir. Eğer zamanında algoritmaları alışverişi yapmak istiyorsanız, Strategy pattern veya Anonymous functions yerine bakabilirsiniz.

Yeniden tanımlamak tarafından Varolan userland fonksiyonu, Refactor, yerine eklemek veya yeniden demek durumunda, o zaman evet: o gösterdiğin kadar basittir. Sadece işlevine ek kod eklemek, ama geriye doğru uyumluluk için varsayılan ayarlarsanız emin olun.

Başka bir seçenek kullanmak olacaktır http://antecedent.github.io/patchwork

Patchwork mümkün gevşek saf PHP işlevselliği runkit_function_redefine kopyalayan, zamanında kullanıcı tanımlı işlevleri ve yöntemleri yeniden tanımlamak için yapan bir PHP kütüphanesi, diğer şeyler arasında, değiştirmek sağlayan, 5.3 kodu, statik ve özel deney çiftler ile yöntemleri.

Sen (üçüncü parti modüller başvurmadan) PHP bir işlevi yeniden tanımlamak ya da 'tanımsız' olamaz. Ancak, koşullu bir fonksiyon tanımlayabilirsiniz.

Işlevini biliyorum Yani, A başka yerde tanımlanabilir, ama her zaman değil, bu gibi sarın:

if (!function_exists('A')) {
    function A() {
        // default A implementation
    }
}

Sonra tek emin istediğiniz uygulama ilk karşılaştı yapmak gerekir:

function A() {
    // another A implementation
}

Her iki fonksiyon aynı anda ilan olamaz, bu bir hata verecektir.

Bunu redeclare olamaz. Soru sadece bu örnek, nasıl aşırı yükleme hakkında ise:

function this($a, $b=1)
{
    return $a * $b;
}

Ekleyeceğiniz yeni argümanları uygun bir varsayılan olarak ayarlanması, geriye dönük uyumluluk, yani için yardımcı olabilir:

function this($a, $b=1){  //New this function with a sane default.
    return $a * $b;
}

Ben de genellikle fonksiyon / değişken isimleri için this kullanarak kaçınarak, açıklık için, tavsiye ederim.

I've got a library of functions that sometimes I just don't want invoked while I'm testing (typically database updates). If I have, for example, a few different db update functions that are all over the code. instead of commenting out the code, I just create a special class (e.g. class foo {}). Define a global variable (e.g., $DEBUG) and a dummy function (e.g., function dummy {}). Inside foo define all the (public static) functions you need to mimic as

$fn = isset($DEBUG) ? 'dummy' : 'real function'; return call_user_func_array($fn,func_get_args());

Artı aramaları ve parametreleri günlüğü gibi, artık başka şeyler yapmanın avantajları var.

Sonra sadece foo :: real_function (...) ile tüm aramaları real_function için (...) değiştirin. Genellikle sadece basit bir arama / değiştirme (ya da orada bırakmak, işlevi oluyor ve ne sıklıkta havai alakasız olabilir denir vurmayacak ne bağlı olarak).