【问题标题】:why used to interface rather than class in below condition.为什么在以下情况下用于接口而不是类。
【发布时间】:2016-09-25 08:56:58
【问题描述】:

我想显示一个名字。名字可能是大写或小写,这取决于我将通过哪个类。我必须接近一个使用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();
    

【问题讨论】:

  • 为什么要创建一个空类来扩展它?
  • @VasilShaddix 不扩展类如何将任何对象传递给 Name CLass

标签: php class interface extends implements


【解决方案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 使用接口,但我认为这有点过头了。

【讨论】:

  • 对不起,当我尝试我们的代码时,即使它不起作用,也没有调用父构造 $name 变量如何检索 @vasil
  • @shivaniparmar 它在抽象类中被调用。当您扩展一个类时,您会收到它的所有公共/受保护方法/参数。所以当你做$userA = new Wuser('Foo');抽象类User的__construct被调用。没有办法,它不起作用,我在发布之前测试了它。
【解决方案2】:

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

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

当你想强制开发者编写getName()方法时记得使用接口,而对于抽象类只是为了让开发者使用父方法getName(),或在必要时覆盖/重载。接口为您提供更多控制和代码重用。

查看PHP object interfaces docPHP class abstraction doc,它可能会阐明您的疑问。

【讨论】:

  • M 谢谢。这很有帮助
猜你喜欢
  • 2014-11-14
  • 2012-03-02
  • 1970-01-01
  • 2015-06-20
  • 2015-05-26
  • 1970-01-01
  • 2018-07-03
  • 2017-05-17
  • 2013-05-13
相关资源
最近更新 更多