2011-03-17 10 views
2

嗨,我想了解如何inherteince使用面向对象编程在PHP中工作。主要类是计算机,继承的类是鼠标。我正在用鼠标类去开发Computer类。我在每个类中使用__construct,当我istinate类时,我首先使用pc类型,如果它有鼠标后。由于某些原因计算机返回null?为什么是这样?PHP类延伸不工作为什么这是如何正确地扩展一个类?

class Computer { 
    protected $type = 'null'; 

    public function __construct($type) { 
     $this->type = $type; 
    } 
    public function computertype() { 
     $this->type = strtoupper($this->type); 
     return $this->type; 
    } 

} 

class Mouse extends Computer { 
    protected $hasmouse = 'null'; 
    public function __construct($hasmouse){ 
     $this->hasmouse = $hasmouse; 

    } 
    public function computermouse() { 
     if($this->hasmouse == 'Y') { 
      return 'This Computer has a mouse'; 
     } 
    } 

} 

$pc = new Computer('PC', 'Y'); 
echo $pc->computertype; 
echo $pc->computermouse; 
+2

没有直接关系的答案,但它会更有意义,如果你的计算机对象有一个鼠标属性,它是一个鼠标类型的对象 – Erik 2011-03-17 00:19:01

+0

@Erik我的评论帮助我走出最多,让我重新思考父类的构建。 – Aaron 2011-03-17 00:57:23

回答

2

它并不像那样工作。如果你创建一个new Computer你就可以得到。你想创建一个new Mouse()这是类型的电脑(虽然这似乎是奇怪inheretance给我)。

父对象(计算机)不知道它有一个孩子(鼠标)。这是因为父类可以有多个孩子。

通常你必须像一个苹果延长计算机或Dell延长计算机,那么你就必须

$a = new apple(); 
$b = new dell(); 

,他们会都在计算机中定义可用的方法,再加上自己的方法。

此外,当你覆盖的方法一样__construct你必须明确地调用父类的构造函数(或方法),如果你想它来执行,例如:

class computer { 
    function __construct() { do stuff } 
} 

class apple extends computer { 
    function __construct() { 
     parent::__construct(); 
     ... do stuff ... 
    } 
} 

只有你实例化的类的方法获取执行。如果它无法在子类中找到该方法,则它会查找链中的方法。即。如果computer类具有“movemouse”,而您的子类没有,则它将在父类中执行movemouse类。

2

相反的:

$ PC =新电脑( 'PC', 'Y');

你想

$鼠标=新的鼠标( 'PC', 'Y');

当前你有它,鼠标扩展计算机。

+0

好吧我已经扭转了他们,但计算机仍然返回null,但由于strtoupper大写,然后在它旁边的'PCTYPE'? – Aaron 2011-03-17 00:13:16

+0

我的答案解决了为什么你有一个空值。两个构造函数都没有运行。 – Erik 2011-03-17 00:14:37

+3

要继承的一件事是“是”一个概念。在您的示例代码中,鼠标是一台计算机。因此,这意味着鼠标可以完成计算机可以执行的任何操作,可能还包括一些功能或以不同的方式。你似乎想要一种通常不是继承的“有 - 一种”关系,而是组合。一台计算机有一个鼠标,因此计算机的构造函数可以带一个鼠标或一个鼠标对象的setter。 – Myles 2011-03-17 00:15:37

4

这不是继承的工作原理。

继承(又名extend)允许您根据其父类的属性和方法扩展子类。

例如,考虑以下几点:

class Peripheral { 
    private $connectionType; 
    private $isConnected = false; 

    function __construct($connectionType) { 
    $this->connectionType = $connectionType; 
    } 

    function getConnectionType() { 
    return $this->connectionType; 
    } 

    function connect() { 
    $this->isConnected = true; 
    } 

    function disconnect() { 
    $this->isConnected = false; 
    } 

    function isConnected() { 
    return $this->isConnected; 
    } 
} 

您现在可以扩展Peripheral类,因为Mouse是外围。

class Mouse extends Peripheral { 
    private $numOfButtons; 

    function __construct($connectionType, $numberOfButtons) { 
    parent::__construct($connectionType); 
    $this->numOfButtons = $numOfButtons; 
    } 

    function getNumOfButtons() { 
    return $this->numOfButtons; 
    } 

    function leftClick() { 
    if($this->isConnected()) 
     echo "Click!"; 
    } 

    function rightClick() { 
    if($this->isConnected()) 
     echo "RightClick!"; 
    } 
} 

现在,因为MousePeripheral一个子类,在Peripheral定义的所有方法都可以访问在Mouse,而不是其他方式...

因此,虽然我可以这样做:

$mouse = new Mouse('USB', 2); 
echo $mouse->getConnectionType(); // USB 
$mouse->connect(); 
$mouse->leftClick(); 

我不能做到以下几点:

$perip = new Peripheral('USB'); 
echo $perip->getConnectionType(); // USB 
$perip->connect(); 
$perip->leftClick(); // ERROR: leftClick not defined. 
+0

你能告诉我如何创建这些类的实例吗? – Aaron 2011-03-17 00:19:59

+0

@Matthew:我相信我已经做到了? – 2011-03-17 00:22:43

+0

写得很好,清澈透明,应该是顶级的! – brasofilo 2012-12-23 00:05:51

1

您当前鼠标的构造函数只接受一个值。如果你希望Mouse接受$ type和$ hasmouse,那么你需要接受两个值。

class Mouse extends Computer { 
    protected $hasmouse = 'null'; 
    public function __construct($type, $hasmouse) { 
     parent::__construct($type); 
     $this->hasmouse = $hasmouse; 
    } 
    public function computermouse() { 
     if($this->hasmouse == 'Y') { 
      return 'This Computer has a mouse'; 
     } 
    } 
} 

$pc = new Mouse('PC', 'Y'); 

我也建议使用布尔(真/假),而不是“Y”

+0

为什么你会建议使用布尔变量? – Aaron 2011-03-17 00:55:12

+1

这样想想吧。声明:它有一个鼠标?真假。这也使得它更容易在条件中使用:'if($ this-> hasmouse)'。最后,因为它是一个标准的约定。有一天,除了你以外,别人会维护你的软件 - 如果你做的事情如“Y”和“N”为真/假,希望他们不知道你住在哪里。 – Erik 2011-03-17 01:30:22