Я хочу показать имя.имя может быть в верхнем или нижнем регистре, это будет зависеть от того, какой класс я передам. class
и второй interface
какой из них лучше и почему?
Решение с использованием класса
class User{
}
class Iuser extends User{
private $name;
function __construct($name){
$this->name = $name;
}
function getName(){
return strtoupper($this->name);
}
}
class Wuser extends User{
private $name;
function __construct($name){
$this->name = $name;
}
function getName(){
return strtolower($this->name);
}
}
class Name{
public $u;
function __construct(User $u){
$this->u = $u;
}
function getName(){
$name = $this->u->getName();
return "Hi My Name is ".$name;
}
}
$name = "Deval Patel";
$iu = new Iuser($name);
$wu = new Wuser($name);
$user = new Name($wu);
echo $user->getName();
Решение с использованием интерфейса
interface User{
public function getName();
}
class Iuser implements User{
private $name;
function __construct($name){
$this->name = $name;
}
function getName(){
return strtoupper($this->name);
}
}
class Wuser implements User{
private $name;
function __construct($name){
$this->name = $name;
}
function getName(){
return strtolower($this->name);
}
}
class Name{
public $u;
function __construct(User $u){
$this->u = $u;
}
function getName(){
$name = $this->u->getName();
return "Hi My Name is ".$name;
}
}
$name = "Deval Patel";
$iu = new Iuser($name);
$wu = new Wuser($name);
$user = new Name($iu);
echo $user->getName();
Используя интерфейсное решение GetName () метод определен, но не реализован в Пользовательский интерфейс (не показано в вашем коде), поэтому каждый реализующий его класс должен определять поведение для получения имени, при этом используя абстрактные классы, вы можете определить стандартный способ получения имени и переопределять или перегружать метод в дочерних классах, когда это необходимо.
Так что для вашего кода я думаю, что лучшим решением является абстракция.
Не забывайте использовать интерфейсы, когда вы хотите заставить разработчика кодировать GetName () метод, а для абстрактных классов просто позволить разработчику использовать родительский метод GetName (), или переопределить / перегрузить при необходимости. Интерфейсы дают вам больше контроля и повторного использования кода.
Обзор PHP объектные интерфейсы док а также PHP класс абстракции док, это может пролить свет на ваши сомнения.
Я бы использовал классы, потому что вы можете повторно использовать некоторый код.
abstract class User
{
protected
$name;
public function __construct($name)
{
$this->name = $name;
}
abstract function getName();
}
class Iuser extends User
{
public function getName()
{
return strtoupper($this->name);
}
}
class Wuser extends User
{
function getName(){
return strtolower($this->name);
}
}
Таким образом, вы все еще можете использовать полиморфизм и повторно использовать некоторый общий код.
Это лучше, чем интерфейс, потому что повторное использование кода. Вы все еще можете использовать интерфейс для абстрактного класса User, но я думаю, что это будет излишним.