如何减少代码重复

3

因为我不熟悉PHP,所以我想知道如何减少这里的代码重复?这两种方法在做相同的事情...除了提取字符串 (filemtimebasename)并连接的部分。

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 );
}
2个回答

4

不要使用两个函数,而是声明一个带有关键回调/函数名称参数$func_name的统一函数:

/**
 * 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');

使用的函数: call_user_func

0

我想我的版本比罗马人的要大得多,但作为一个面向对象编程问题,我认为这也是一种可行的解决方案:

<?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);

抱歉给你带来了困惑的类名或方法名。希望你能理解我的意思。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接