为什么在下面的条件下使用接口而不是 class。

why used to interface rather than class in below condition.

我想显示一个 name.name 可能是大写或小写,这将取决于 class 我将 pass.i 必须接近一个正在使用 class 第二个是 interface 哪个更好,为什么?

  1. 解决方案使用Class

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

我会使用 classes,因为您可以重用一些代码。

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

这样您仍然可以使用多态性并重用一些通用代码。

它比接口更好,因为代码重用。您仍然可以为抽象 class User 使用接口,但我认为这会有点矫枉过正。

使用接口解决方案 getName() 方法已定义但未在 用户界面 中实现(未在您的代码中显示),所以每个 class 实现它都必须定义获取名称的行为,而使用抽象 classes 你可以定义获取名称的标准方法,并覆盖或重载子 [=28 中的方法=]必要时。

所以对于你的代码,我认为最好的解决方案是抽象。

当您想要强制开发人员编写 getName() 方法的代码时,请记住使用接口,而抽象 classes 只是为了允许开发人员使用父方法 getName() 或 override/overload(如有必要)。接口为您提供更多控制和代码重用。

查看PHP object interfaces doc and PHP class abstraction doc,它可能会为您的疑惑提供一些线索。