php - Ben farklı isimler, aynı içeriğe sahip fonksiyonları entegre edebilir miyim?

2 Cevap php

Ben aslında aynı şeyi yapmak, bir sınıf içinde fonksiyonların bir çift var:

public function fn_a(){
        return __FUNCTION__;
}
public function fn_b(){
        return __FUNCTION__;
}
public function fn_c(){
        return __FUNCTION__;
}

Ben bu yüzden bilerek not yaptın mevcut isimleri kalması bu işlevleri gerekir:

public function fn_($letter){
        return __FUNCTION__.$letter;
}

Hepsi aynı şeyi beri, burada kod detaylarının küçültmek için bir şekilde bir çeşit umuyordum. Nihai durum bu gibi bir şey olacaktır:

public functions fn_a, fn_b, fn_c() {
      return __FUNCTION__;
}

Another solution, if applicable, might be doing something like Class's "extends": fn_b, fn_c extend fn_a?

Siz ne düşünüyorsunuz?

2 Cevap

Eğer önerilen gibi herhangi bir sözdizimi mümkün değildir: Eğer birkaç farklı işlevleri istiyorsanız, tüm bu fonksiyonları bildirmek zorunda.

Yine de, bir olasılık fn_a, fn_b ve fn_c fonksiyonları sadece daha karmaşık bir civarı basit korumalar olması olabilir:

public function fn_a(){
    return fn_all('a');
}
public function fn_b(){
    return fn_all('b');
}
public function fn_c(){
    return fn_all('c');
}

public function fn_all($name) {
    // a lot of complex stuff here
}

Bunun üzerine, fn_all fonksiyonu uzunluğuna bağlı olarak, tabii ki, kod-çoğaltılması miktarını azaltacaktır.



Başka bir fikir (not sure how this could be done with methods, so I'll demonstrate with functions) Kapaklar kullanmak olacaktır - PHP> = 5.3 demektir

Bir ilk işlevi olurdu bu varlık temel fikir, o başka bir dönecekti - ilkine geçirilen parametre bağlama hangi:

İlk olarak, diğer oluşturur fonksiyonu:

function creator($name) {
    return function () use ($name) {
        return $name;
    };
}

Ve sonra, o yaratıcısı biri kullanılarak, üç fonksiyonlarını alalım:

$fn_a = creator('a');
$fn_b = creator('b');
$fn_c = creator('c');

Ve şimdi, bu üç işlevi çağırarak:

echo $fn_a() . '<br />';
echo $fn_b() . '<br />';
echo $fn_c() . '<br />';

Biz şu çıktıyı alırsınız:

a
b
c


I've never good at explaining how anonymous functions and closures work -- but searching for "closure" on google should help you understand ; note that you can read tutorial about closures in Javascript : the idea is exactly the same.

(And, as closures are new in PHP -- arrived with PHP 5.3 -- you will not find as many tutorials as for Javascript)

public function fn_catcher($letter) {
        return __FUNCTION__.$letter;
}

public function __call($name) {
        if (substr($name, 0, 3) == 'fn_')
        {
              return $this->fn_catcher($name);
        }
}

Bunun gibi?