Если вы хотите, чтобы Encode и Decode были отдельными классами, вы можете создавать их экземпляры в Encrypt. Например:
<?
class Encrypt {
private $encoder;
private $decoder;
public function __construct() {
$this->encoder = new Encode();
$this->decoder = new Decode();
}
public function encode($string) {
return $this->encoder->encode($string);
}
public function decode($string) {
return $this->decoder->decode($string);
}
}
?>
В этом примере Encode и Decode должны быть конкретными классами. Но вы можете рассмотреть возможность использования интерфейсов вместо этого. Интерфейсы полезны, если вы считаете, что вам может понадобиться использовать разные типы объектов кодирования и декодирования в разных ситуациях. Например, может быть, у вас есть класс TripleDESEncode и класс BlowfishEncode. Они оба могут реализовать общий интерфейс, например так:
<?
interface IEncode {
public function encode($string);
}
class TripleDESEncode implements IEncode {
public function encode($string) {...}
}
class BlowfishEncode implements IEncode {
public function encode($string) {...}
}
?>
В этом случае вы можете сначала создать конкретные экземпляры, которые хотите использовать, а затем передать их в конструктор Encrypt. Это называется внедрением зависимости:
<?
class Encrypt {
public function __construct(IEncode $encoder, IDecode $decoder) {
$this->encoder = $encoder;
$this->decoder = $decoder;
}
...
}
$myEncrypt = new Encrypt(new BlowfishEncode(), new BlowfishDecode());
echo $myEncrypt->encode('test');
?>