2017-03-02 11 views
3

私はPHPに精通していないので、ここでコードの重複を減らすにはどうすればよいですか?どちらのメソッドも、ここでは全く同じことをしています...文字列が抽出された部分(filemtimebasename)を除いて結合されています。コードの複製を減らす方法

/** 
* Gets joined files hash 
* 
* @param $files an array of file paths 
* @param $func_name callback name 
* @return mixed 
*/ 
private function getFilesHash($files, callable $func_name) { 
    $joined = ""; 

    foreach ($files as $file) { 
     $joined .= call_user_func($func_name, $file); 
    } 

    return $this->checksum($joined); 
} 

使用法:

$fileHash = getFilesHash($files, 'basename'); 

使用する機能

private function modified_hash($files) { 
    $joined = ""; 

    foreach ($files as $file) { 
     $joined .= filemtime($file); 
    } 

    return $this->checksum($joined); 
} 

private function filename_hash($files) { 
    $joined = ""; 

    foreach ($files as $file) { 
     $joined .= basename($file); 
    } 

    return $this->checksum($joined); 
} 

答えて

4

代わりの二つの機能は、重要なコールバック/関数名$func_nameの引数で統一された関数を宣言します: call_user_func

0

は、私は私のバージョンは、ローマ人への手紙その後、道大きいと思いますが、OOPの問題として私は、これはあまりにも可能な解決策だと思う:混乱クラスやメソッド名の

<?php 

interface HashInterface 
{ 
    public function hash(); 
} 

class ModifiedHash implements HashInterface 
{ 
    public function hash($file) 
    { 
     return filemtime($file); 
    } 
} 

class FileNameHash implements HashInterface 
{ 
    public function hash($file) 
    { 
     return basename($file); 
    } 
} 

class SomeClient 
{ 
    private $hashType; 

    public function setHashType(HashInterface $hashType) 
    { 
     $this->hashType = $hashType; 
    } 

    private function doHash($files) { 
     $joined = ""; 

     foreach ($files as $file) { 
      $joined .= $this->hashType->hash($file); 
     } 

     return $this->checksum($joined); 
    } 
} 

$client = new SomeClient(); 
$files = ???; 

// Want a ModifiedHash? 
$client->setHashType(new ModifiedHash()); 
$data = $client->doHash($files); 

// Want a FileNameHash? 
$client->setHashType(new FileNameHash()); 
$data = $client->doHash($files); 

申し訳ありません。私はあなたがそのアイディアを得たことを願っています

関連する問題