我想显示一个name.name可以是大写或小写,这将取决于我将传递哪个类。我必须接近一个使用class
,其次是interface
哪一个更好,为什么?
使用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();
使用界面解决方案
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();
答案 0 :(得分:2)
使用接口解决方案 getName()方法已定义但未在用户界面中实现(未在代码中显示),因此实现它的每个类都必须定义获取名称的行为,使用抽象类时,您可以定义获取名称的标准方法,并在必要时覆盖或重载子类中的方法。
因此,对于您的代码,我认为最好的解决方案是抽象。
当您想强制开发人员编写 getName()方法时,请记住使用接口;对于抽象类,只允许开发人员使用父方法 getName()< / em>,或必要时覆盖/重载。接口为您提供更多控制和代码重用。
查看PHP object interfaces doc和PHP 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的接口,但我认为这将是一种过度杀伤。