из ООП написание мутированного объекта

DiMasKiss

Новичок
из ООП написание мутированного объекта

test.php
PHP:
$string     = 'anystring';  $algorithm1 = new Task_Algorithm_Md5();  
$algorithm2 = new Task_Algorithm_Sha1();

if(md5($string) == $mutator->transform($string)) {
    echo "md5 OK\n";
} else {
    echo "md5 Failed\n";
}

$mutator->setAlgorithm($algorithm2);

if(sha1($string) == $mutator->transform($string)) {
    echo "sha1 OK\n";
} else {
    echo "sha1 Failed\n";
}
экземпляр $mutator наследует функцию transform($string) объекта $algorithm2 при передаче самого объекта $mutator->setAlgorithm($algorithm2);
Как наследовать функцию transform() или сменить адресацию из других объектов
 

whirlwind

TDD infected, paranoid
Может не наследует, а делегирует? Сделать фасад с интерфейсом transform, внутри которого инкапсулировать алгоритмы шифрования. Честно говоря, проблему понять довольно трудно. Конкретные примеры использования объектов можно посмотреть?
 

DiMasKiss

Новичок
в общем, сделал по простому, через инкапсуляцию.
у меня другой вопрос, что значит выражение:
PHP:
(string)$mutator
$mutator - экземпляр класса.
 

AmdY

Пью пиво
Команда форума
фабрика
PHP:
$string     = 'anystring';  
$algorithm1 = Task_Algorithm::factory( Task_Algorithm::md5 );   
$algorithm2 = Task_Algorithm::factory( Task_Algorithm::sha1 );

if(md5($string) == $mutator->transform($string)) { 
    echo "md5 OK\n"; 
} else { 
    echo "md5 Failed\n"; 
} 

$mutator->setAlgorithm($algorithm2); 

if(sha1($string) == $mutator->transform($string)) { 
    echo "sha1 OK\n"; 
} else { 
    echo "sha1 Failed\n"; 
}
 

korchasa

LIMB infected
AmdY
Код:
$algorithm1 = Task_Algorithm::factory( Task_Algorithm::md5 );
Вот зачем тут фабрика? Зачем константа в Task_Algorithm? Если надо будет добавить новый алгоритм, то мне править код Task_Algorithm?
 

AmdY

Пью пиво
Команда форума
ой, сорри, алгоритм действительно нужно брать из конфига, а то бред получился. а константа, чтобы в конфиге удобно было прописывать
 

AmdY

Пью пиво
Команда форума
может и не тру, но я стараюсь на память такие вещи не зауцчивать. да и править не обязательно, он же и без констант подхватится, но константы помогают мне лучше помнить возможности и реализованый функционал.
Task_Algorithm::factory( 'md5' );
 

fixxxer

К.О.
Партнер клуба
А зачем такие сложности?..

PHP:
interface IHasher {
    public function hash($string);
}

class MD5_Hasher implements IHasher {
    public function hash($string) {
        return md5($string);
    }
}

class MD5_Salt_Hasher implements IHasher {
    private $salt;
    public function __construct($salt) {
        $this->salt = $salt;
    }
    public function hash($string)  {
        return md5($string . $this->salt);
    }
}
// ....
class Mutator {
    private $Hasher
    public function __construct(IHasher $Hasher) {
        $this->Hasher = $Hasher;
    }
    public function transform($string) {
        return $this->Hasher->hash($string);
    }
}
// ....

$Mutator = new Mutator(new Md5_Salt_Hasher('salt_str'));
print $Mutator->transform('hash_me');
еще такое через IoC можно конфигурить ;)
 

DiMasKiss

Новичок
Спасибо всем, особенно fixxxer!
Очень помогло - объектно-ориентированный подход).
И извиняюсь пред теми, что если где-то, что-то совместно не доработал.
 
Сверху