Autor Zpráva
nethor
Profil
Zdravím, ve třídě potřebuji definovat více prakticky stejných metod:
    
function Type($val)        {    
    $this->Type = $val;     
    return $this;     
} 

function Name($val)        {    
    $this->Name = $val;     
    return $this;     
} 

Jdou nadefinovat nějak hromadně?
Zkoušel jsem:
    function Functions(){
        $FceNames = array() ;
        $FceNames[] = "Type" ;    
        $FceNames[] = "Name" ;    
        $FceNames[] = "Size" ;    
        $FceNames[] = "MaxSize" ;    
        $FceNames[] = "Label" ;    
        $FceNames[] = "Title" ;    
        $FceNames[] = "Group" ;    
        foreach ($FceNames as $FceName) {
            if (!method_exists($this , $FceName)) {
                $$FceName = function ($val)        {    
                    $this->$FceName = $val;    
                    return $this;     
                } ;
              }        
          }            
        return $this        ;
    }

To ale nefunguje. A koukal jsem, že create_function() je DEPRECATED .
Jak na to?
Keeehi
Profil
Dá se to řešit implementací magické metody __call.

Otázka je, proč to potřebuješ. Tohle se hodí, když nevíš, jaké metody budou existovat. Třeba pro nějakého abstraktního předka nějaké knihovny kterého pak budou jiní rozšiřovat.
Tohle mi ale spíš přijde, že metody dopředu znáš, jen se ti to nechce psát. Tak nebuď líný a ty settery napiš. Pokud používáš nějaké IDE, tak tam pravděpodobně bude i možnost, aby ty settery za tebe vygenerovalo.
nethor
Profil
Chtěl jsem se zbavit zbytečné otročiny se setery a zpřehlednit kód, to je něco jiného, než lenost.
Přes __call() jsem to zkoušel, ale snažil jsem se v ní definovat metody, nedošlo mi, že je to zbytečné.
Máš pravdu, nakonec to přes ní šlo docela snadno.
    function __call($Fce, $Args){
        if(in_array($Fce , $this->VarNames())){
            $this->$Fce = trim($Args[0]);
        }        
        return $this    ;
    }
    function VarNames(){
        $this->VarNames = array() ;
        $this->VarNames[] = "Type" ;    
        $this->VarNames[] = "Name" ;    
                //  ...    
        return $this->VarNames        ;
    }
blaaablaaa
Profil
nethor:
Tohle kód právě naopak znepřehlední.

Pokud člověk používá normální IDE (od Netbeans až po PHPStorm), tak mu při psaní
$honza = new Clovek();
$honza->se...
nabídne všechny možné settery (metody začínající na "se"). S tímto dynamickým řešením se tak nestane. Pokud tedy člověk udělá překlep v $honza->Nmae('Honza'), může se stát, že to bez testů zjistí až na produkci.

Zároveň je dobré držet se nějakých coding standards (a raději obecně používaných - PSR, než vlastních).
Tedy např. v názvech funkcí a proměnných používat na začátku malá písmena,
N71
Profil *
Kromě magické metody __call existuje i __set, což je jak vidno z kódu bližší těmto potřebám (udělat trim na nastavované hodnotě).

Obecně jsou dle mého soudu magické metody taková skoro prasečina, která se blbě používá, blbě testuje, blbě ladí a blbě refaktoruje. Co člověk ušetří na psaní kódu, to si dvojnásob vynahradí na psaní anotací. Bylo by asi bývalo lepší, kdyby PHP do nějaké budoucí verze zařadilo i normální accessor metody.
Keeehi
Profil
blaaablaaa:
Čistě technicky, napovídání názvu metod se dá přidat přes komentáře. Ale je to další psaní.

N71:
Pokud se použije __set, pak se k tomu přistupuje skrz atributy místo metod. Rozdíl je, že ty metody se pak mohou řetězit, což u atributů myslím nejde.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0