受保护的建设者是否被视为良好做法

Álv*_*lez 7 php oop

我正在写一些小助手类来处理树木.基本上,我有一个节点和一个代表树的特殊根节点.我想保持它的通用性和简单性.这是代码的一部分:

<?php

class Tree extends TreeNode{
    public function addById($node_id, $parent_id, $generic_content){
        if( $parent = $this->findNodeById($parent_id) ){
            $parent->addChildById($node_id, $generic_content);
        }
    }
}

class TreeNode{
    public function __construct($node_id, $parent_id, $generic_content){
        // ...
    }

    protected function addChildById($node_id, $generic_content){
        $this->children[] = new TreeNode($this->node_id, $node_id, $generic_content);
    }
}

$Categories = new Tree;
$Categories->addById(1, NULL, $foo);
$Categories->addById(2, NULL, $bar);
$Categories->addById(3, 1, $gee);

?>
Run Code Online (Sandbox Code Playgroud)

我的问题:

  • TreeNode通过强制创建实例是否明智TreeNode::addById()
  • 如果是这样,那么宣布TreeNode::__construct()私有/受保护是不错的做法?

dar*_*iom 4

我认为在某些情况下,控制对象的构造并隐藏公共构造函数确实有意义。

您的代码确实如此:类Tree控制其子级的TreeNode创建和初始化方式非常有用,因为它需要控制在树层次结构中添加节点的位置。

如果类之间的关系使得一个类拥有有关另一个类的信息,那么对对象构造的这种控制就尤其重要。

例如:如果您稍微更改了实现并允许Tree类管理树中所有节点的节点 ID(您可以将它们存储在类内的数组中Tree)。在这种情况下,控制s 的创建和初始化Tree方式将非常引人注目,并且通过类上的方法来执行此操作非常有意义。TreeNodeTree