从DB表创建对象

时间:2017-01-18 15:37:13

标签: php oop

示例数据库:

level1  | level2      | level3 | datatype | maxlen | minlen
-----------------------------------------------------------
version | NULL        | NULL   | element  | 0      | 0
version | release     | NULL   | string   | 2      | 0  
version | build       | NULL   | string   | 5      | 0
service | NULL        | NULL   | element  | 0      | 0
service | subservice1 | NULL   | element  | 0      | 0
service | subservice1 | value1 | string   | 10     | 5
service | subservice1 | value2 | string   | 50     | 1

此表(我在此示例中省略了一堆)表示SOAP API的默认值(字符串长度,必需/可选标志和其他内容)。 我尝试了几种方法,但没有人把我带到我想去的地方。我想我不太了解递归的概念(是一个单词?)。

我需要的是一个对象

stdClass Object (
    [version] => stdClass Object (
        [release] => stdClass Object (
            [maxlen] => 2
            [minlen] => 0
        )
        [build] => stdClass Object (
            [maxlen] => 5
            [minlen] => 0
        )       
    )
    [service] => stdClass Object (
        [subservice1] => stdClass Object (
            [value1] => stdClass Object (
                [maxlen] => 10
                [minlen] => 5
            )
            [value2] => stdClass Object (
                [maxlen] => 50
                [minlen] => 1
            )
        )
    )
)

等等。最多有7个级别,我希望能够访问这样的默认值

$var = $object->service->subservice1->value1->maxlen

也许有人可以指出我正确的方向?谢谢!

2 个答案:

答案 0 :(得分:0)

我根本不喜欢它,但它似乎有用......

CLASS dhl_object {

        public $objTemplate;


        public function __construct() {

            global $conn_secuser;

            if(!$result = getAllRows($conn_secuser, "reference_dhl")) {
                return FALSE;
            } else {

                if($result->num_rows<=0) {
                    return FALSE;
                } else {

                    $object = new stdClass();

                    while($row = $result->fetch_assoc()) {

                        $id     =   $row["id"];
                        $L1     =   $row["L1"];
                        $L2     =   $row["L2"];
                        $L3     =   $row["L3"];
                        $L4     =   $row["L4"];
                        $L5     =   $row["L5"];
                        $L6     =   $row["L6"];
                        $L7     =   $row["L7"];
                        $dataType   =   $row["dataType"];
                        $minLength  =   $row["minLength"];
                        $maxLength  =   $row["maxLength"];
                        $required   =   $row["required"];
                        $note       =   $row["note"];

                        // possible dataTypes: Element, String, Decimal, Integer, Enumeration
                        if($dataType!="Element") {

                            if($L7) {

                                if(!isset($object->$L1)) $object->$L1 = new stdClass();
                                if(!isset($object->$L1->$L2)) $object->$L1->$L2 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3)) $object->$L1->$L2->$L3 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3->$L4)) $object->$L1->$L2->$L3->$L4 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3->$L4->$L5)) $object->$L1->$L2->$L3->$L4->$L5 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3->$L4->$L5->$L6)) $object->$L1->$L2->$L3->$L4->$L5->$L6 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3->$L4->$L5->$L6->$L7)) $object->$L1->$L2->$L3->$L4->$L5->$L6->$L7 = new stdClass();

                                $object->$L1->$L2->$L3->$L4->$L5->$L6->$L7->minLength   = $minLength;
                                $object->$L1->$L2->$L3->$L4->$L5->$L6->$L7->maxLength   = $maxLength;
                                $object->$L1->$L2->$L3->$L4->$L5->$L6->$L7->required    = $required;
                                $object->$L1->$L2->$L3->$L4->$L5->$L6->$L7->note        = $note;
                                $object->$L1->$L2->$L3->$L4->$L5->$L6->$L7->value       = "";

                            } else
                            if($L6) {

                                if(!isset($object->$L1)) $object->$L1 = new stdClass();
                                if(!isset($object->$L1->$L2)) $object->$L1->$L2 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3)) $object->$L1->$L2->$L3 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3->$L4)) $object->$L1->$L2->$L3->$L4 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3->$L4->$L5)) $object->$L1->$L2->$L3->$L4->$L5 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3->$L4->$L5->$L6)) $object->$L1->$L2->$L3->$L4->$L5->$L6 = new stdClass();

                                $object->$L1->$L2->$L3->$L4->$L5->$L6->minLength    = $minLength;
                                $object->$L1->$L2->$L3->$L4->$L5->$L6->maxLength    = $maxLength;
                                $object->$L1->$L2->$L3->$L4->$L5->$L6->required     = $required;
                                $object->$L1->$L2->$L3->$L4->$L5->$L6->note         = $note;
                                $object->$L1->$L2->$L3->$L4->$L5->$L6->value        = "";

                            } else
                            if($L5) {

                                if(!isset($object->$L1)) $object->$L1 = new stdClass();
                                if(!isset($object->$L1->$L2)) $object->$L1->$L2 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3)) $object->$L1->$L2->$L3 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3->$L4)) $object->$L1->$L2->$L3->$L4 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3->$L4->$L5)) $object->$L1->$L2->$L3->$L4->$L5 = new stdClass();

                                $object->$L1->$L2->$L3->$L4->$L5->minLength = $minLength;
                                $object->$L1->$L2->$L3->$L4->$L5->maxLength = $maxLength;
                                $object->$L1->$L2->$L3->$L4->$L5->required  = $required;
                                $object->$L1->$L2->$L3->$L4->$L5->note      = $note;
                                $object->$L1->$L2->$L3->$L4->$L5->value     = "";

                            } else
                            if($L4) {

                                if(!isset($object->$L1)) $object->$L1 = new stdClass();
                                if(!isset($object->$L1->$L2)) $object->$L1->$L2 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3)) $object->$L1->$L2->$L3 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3->$L4)) $object->$L1->$L2->$L3->$L4 = new stdClass();

                                $object->$L1->$L2->$L3->$L4->minLength  = $minLength;
                                $object->$L1->$L2->$L3->$L4->maxLength  = $maxLength;
                                $object->$L1->$L2->$L3->$L4->required   = $required;
                                $object->$L1->$L2->$L3->$L4->note       = $note;
                                $object->$L1->$L2->$L3->$L4->value      = "";

                            } else
                            if($L3) {

                                if(!isset($object->$L1)) $object->$L1 = new stdClass();
                                if(!isset($object->$L1->$L2)) $object->$L1->$L2 = new stdClass();
                                if(!isset($object->$L1->$L2->$L3)) $object->$L1->$L2->$L3 = new stdClass();

                                $object->$L1->$L2->$L3->minLength   = $minLength;
                                $object->$L1->$L2->$L3->maxLength   = $maxLength;
                                $object->$L1->$L2->$L3->required    = $required;
                                $object->$L1->$L2->$L3->note        = $note;
                                $object->$L1->$L2->$L3->value       = "";

                            } else
                            if($L2) {

                                if(!isset($object->$L1)) $object->$L1 = new stdClass();
                                if(!isset($object->$L1->$L2)) $object->$L1->$L2 = new stdClass();

                                $object->$L1->$L2->minLength    = $minLength;
                                $object->$L1->$L2->maxLength    = $maxLength;
                                $object->$L1->$L2->required     = $required;
                                $object->$L1->$L2->note         = $note;
                                $object->$L1->$L2->value        = "";

                            } else
                            if($L1) {

                                if(!isset($object->$L1)) $object->$L1 = new stdClass();

                                $object->$L1->minLength = $minLength;
                                $object->$L1->maxLength = $maxLength;
                                $object->$L1->required  = $required;
                                $object->$L1->note      = $note;
                                $object->$L1->value     = "";

                            } 

                        }

                    }

                    $this->objTemplate = $object;

                }
            }

        }

    }

我希望有人有改进的建议.. :)

答案 1 :(得分:0)

这样的东西?

$root = (object) [];

while($row = $result->fetch_assoc()) {
    if ($row['datatype'] == 'Element') {
        continue;
    }

    $tgt = &$root;
    for($i = 1; $i <= 7; ++$i) {
        $rowkey = 'L'.$i;

        if ($row[$rowkey] === null) {
            break;
        }

        if (!property_exists($tgt, $row[$rowkey])) {
            $tgt->{$row[$rowkey]} = (object) [];
        }

        $tgt = &$tgt->{$row[$rowkey]};
    }

    $tgt = (object) [
        'minLength' => $row['minLength'],
        'maxLength' => $row['maxLength'],
        'required'  => $row['required'],
        'note'      => $row['note'],
        'value'     => ''
    ];
}
unset($tgt);

注意:我没有运行它,因为我没有任何测试数据。应该相当接近工作。

正如其他人已经说过的那样:花一些时间阅读有关对象等,以便了解您正在使用的内容。

非常基本的编码规则:Don't Repeat Yourself我对你输入所有这些内容感到厌倦 - &gt; $ L中途通过它;)。

另外,请注意&amp ;.使用时要小心(PHP references

(如果代码不能与你的数据一起使用,请告诉我:))