为什么习惯于在下面的条件下接口而不是类。

时间:2016-05-27 06:31:48

标签: php class interface extends implements

我想显示一个name.name可以是大写或小写,这将取决于我将传递哪个类。我必须接近一个使用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();
    

2 个答案:

答案 0 :(得分:2)

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

因此,对于您的代码,我认为最好的解决方案是抽象。

当您想强制开发人员编写 getName()方法时,请记住使用接口;对于抽象类,只允许开发人员使用父方法 getName()< / em>,或必要时覆盖/重载。接口为您提供更多控制和代码重用。

查看PHP object interfaces docPHP class abstraction doc,可能会对您的疑问有所了解。

答案 1 :(得分:1)

我会使用类,因为你可以重用一些代码。

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的接口,但我认为这将是一种过度杀伤。