我想显示一个 name.name 可能是大写或小写的,这将取决于我将通过哪个类.我必须接近一个是使用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使用接口,但我认为这将是矫枉过正。