почему используется для интерфейса, а не класса в условиях ниже.

Я хочу показать имя.имя может быть в верхнем или нижнем регистре, это будет зависеть от того, какой класс я передам. class и второй interface какой из них лучше и почему?

  1. Решение с использованием класса

    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();
    
  2. Решение с использованием интерфейса

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

1

Решение

Используя интерфейсное решение GetName () метод определен, но не реализован в Пользовательский интерфейс (не показано в вашем коде), поэтому каждый реализующий его класс должен определять поведение для получения имени, при этом используя абстрактные классы, вы можете определить стандартный способ получения имени и переопределять или перегружать метод в дочерних классах, когда это необходимо.

Так что для вашего кода я думаю, что лучшим решением является абстракция.

Не забывайте использовать интерфейсы, когда вы хотите заставить разработчика кодировать GetName () метод, а для абстрактных классов просто позволить разработчику использовать родительский метод GetName (), или переопределить / перегрузить при необходимости. Интерфейсы дают вам больше контроля и повторного использования кода.

Обзор PHP объектные интерфейсы док а также PHP класс абстракции док, это может пролить свет на ваши сомнения.

2

Другие решения

Я бы использовал классы, потому что вы можете повторно использовать некоторый код.

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, но я думаю, что это будет излишним.

1

По вопросам рекламы [email protected]