0

我是一个拥有整个类继承的新手,但我对 php 有点困惑。

我想要以下内容:

class Base
{
     //some fields and shared methods...
}

class Node
{
     private $children = array();

     public function getChildren()
     {
          ...
     }

     public function addChild($item)
     {
         $children[] = $item;
     }

     public function sum()
     {
     }
}

I want $item to be either another Node or a Leaf:

class Leaf extends Base
{
     private $value;

     public getValue()
     {
     }

     public setValue($someFloatNumber)
     {
          $this->value = $someFloatNumber;
     }
} 

对于公共总和(),我想要类似的东西:

$sum = 0;

foreach ($children as $child)
{
    switch(gettype($child))
    {
        case "Node":
           $sum+= ((Node) $child)->sum();
           break;
        case "Leaf":
           $sum+= ((Leaf) $child)->getValue();
           break;
    }
}

return $sum;

不知道怎么做演员表。数组还会存储添加的 $item 的类型吗?

4

2 回答 2

1

这不是正确的 OOP。试试这个:

将方法添加sumBase(如果您不想实现,请抽象)。为实现同样的方法sumLeaf它只会返回它的getValue. 然后你可以简单地调用sum这两种类型,因此不需要大小写,或者知道它的类型等等:

foreach ($children as $child) {
    $sum += $child->sum();
}

这称为多态性,它是面向对象编程的基本概念之一。

要回答您的问题,您可以在 Netbeans 和 Zend Studio(可能还有其他编辑器)中本地提示输入:

/* @var $varName Type_Name */
于 2013-01-24T01:23:59.080 回答
1

您正在询问提示,但随后,在您的代码中,您实际上尝试进行强制转换。以这种方式没有必要也不可能。

提示示例:

private function __construct(Base $node) {}

这确保您只能将类的实例Base或继承类传递给函数。

或者,如果它对在您的 IDE 中工作很重要,您可以执行以下操作:

$something = $child->someMethod(); /* @var $child Base */

这将确保您的 IDE(和其他软件)知道它$child属于Base.

而不是铸造,你可以is_a像这样使用:

if (is_a($child, 'Node') {}
else (is_a($child, 'Leaf') {}

但老实说,您似乎应该重构您的代码。我不认为叶子与节点有任何不同是一个好主意。叶子只是一个没有任何子节点的节点,您可以随时对其进行测试$node->hasChildren(),甚至可以根据需要设置和取消设置叶子标志。

于 2013-01-24T01:28:23.210 回答