PHP:在OO中作为对象处理JSON会更好吗?

PHP:在OO中作为对象处理JSON会更好吗?,php,json,oop,Php,Json,Oop,我知道PHP,但不太了解PHP中的OO。在Joomla工作时,我看到了使用OO和MVC的好处,并且喜欢它的表现方式。但我经常遇到这样的情况,我不知道这是不是一个好的面向对象的糖果。下面是一个以JSON字符串输出为print\r的列车时刻表示例 为了在不使用PHP中的OO的情况下从时刻表中提取各种火车站,我使用嵌套的“foreach”来获取火车站的出发和到达时间 将其作为OO环境中的对象处理可能会更好吗?如果不使用所有嵌套的“foreach”语句来创建更优雅的编程环境,那么获取数据是否会更容易?或

我知道PHP,但不太了解PHP中的OO。在Joomla工作时,我看到了使用OO和MVC的好处,并且喜欢它的表现方式。但我经常遇到这样的情况,我不知道这是不是一个好的面向对象的糖果。下面是一个以JSON字符串输出为print\r的列车时刻表示例

为了在不使用PHP中的OO的情况下从时刻表中提取各种火车站,我使用嵌套的“foreach”来获取火车站的出发和到达时间

将其作为OO环境中的对象处理可能会更好吗?如果不使用所有嵌套的“foreach”语句来创建更优雅的编程环境,那么获取数据是否会更容易?或者切换到OO不会进一步简化此任务和PHP代码的可读性

如果您觉得OO是一条发展之路,那么您可以给出一个PHP的外观示例,使用下面的示例来改进环境,这将非常有帮助。谢谢

stdClass Object
(
    [ITEM] => Array
        (
            [0] => stdClass Object
                (
                    [ITEM_INDEX] => 0
                    [SCHED_DEP_DATE] => 10:46:00 06/13/2013
                    [DESTINATION] => New York
                    [TRACK] => 2
                    [LINE] => AMTK
                    [TRAIN_ID] => A98
                    [STATUS] => ARRIVED
                    [BACKCOLOR] => yellow
                    [FORECOLOR] => black
                    [SHADOWCOLOR] => yellow
                    [GPSLATITUDE] => 40.7347
                    [GPSLONGITUDE] => -74.1644
                    [GPSTIME] => 6/13/2013 12:06:05 PM
                    [TRAIN_LINE] => Northeast Corridor Line
                    [STATION_POSITION] => 1
                    [LINEABBREVIATION] => AMTK
                    [INLINEMSG] => 
                    [STOPS] => stdClass Object
                        (
                            [STOP] => stdClass Object
                                (
                                    [NAME] => New York Penn Station
                                    [TIME] => 6/13/2013 12:26:11 PM
                                    [DROPOFF] => Discharge Only
                                )

                        )

                )

            [1] => stdClass Object
                (
                    [ITEM_INDEX] => 1
                    [SCHED_DEP_DATE] => 11:57:00 06/13/2013
                    [DESTINATION] => New York
                    [TRACK] => 1
                    [LINE] => AMTK
                    [TRAIN_ID] => A644
                    [STATUS] => in 2 Min
                    [BACKCOLOR] => yellow
                    [FORECOLOR] => black
                    [SHADOWCOLOR] => yellow
                    [GPSLATITUDE] => 
                    [GPSLONGITUDE] => 
                    [GPSTIME] => 6/13/2013 12:08:15 PM
                    [TRAIN_LINE] => Northeast Corridor Line
                    [STATION_POSITION] => 1
                    [LINEABBREVIATION] => AMTK
                    [INLINEMSG] => quiet car is in the rear.........thank you
                    [STOPS] => stdClass Object
                        (
                            [STOP] => stdClass Object
                                (
                                    [NAME] => New York Penn Station
                                    [TIME] => 6/13/2013 12:28:33 PM
                                )

                        )

                )

            [2] => stdClass Object
                (
                    [ITEM_INDEX] => 2
                    [SCHED_DEP_DATE] => 12:09:00 06/13/2013
                    [DESTINATION] => Raritan
                    [TRACK] => 5
                    [LINE] => RARV
                    [TRAIN_ID] => 5423
                    [STATUS] => ALL ABOARD
                    [BACKCOLOR] => Orange
                    [FORECOLOR] => white
                    [SHADOWCOLOR] => black
                    [GPSLATITUDE] => 
                    [GPSLONGITUDE] => 
                    [GPSTIME] => 6/13/2013 11:23:37 AM
                    [TRAIN_LINE] => Raritan Valley Line
                    [STATION_POSITION] => 0
                    [LINEABBREVIATION] => RARV
                    [INLINEMSG] => 
                    [STOPS] => stdClass Object
                        (
                            [STOP] => Array
                                (
                                    [0] => stdClass Object
                                        (
                                            [NAME] => Union
                                            [TIME] => 6/13/2013 12:18:00 PM
                                        )

                                    [1] => stdClass Object
                                        (
                                            [NAME] => Roselle Park
                                            [TIME] => 6/13/2013 12:21:30 PM
                                        )

                                    [2] => stdClass Object
                                        (
                                            [NAME] => Cranford
                                            [TIME] => 6/13/2013 12:26:15 PM
                                        )

                                    [3] => stdClass Object
                                        (
                                            [NAME] => Westfield
                                            [TIME] => 6/13/2013 12:30:15 PM
                                        )

                                    [4] => stdClass Object
                                        (
                                            [NAME] => Fanwood
                                            [TIME] => 6/13/2013 12:34:30 PM
                                        )

                                    [5] => stdClass Object
                                        (
                                            [NAME] => Netherwood
                                            [TIME] => 6/13/2013 12:37:45 PM
                                        )

                                    [6] => stdClass Object
                                        (
                                            [NAME] => Plainfield
                                            [TIME] => 6/13/2013 12:40:45 PM
                                        )

                                    [7] => stdClass Object
                                        (
                                            [NAME] => Dunellen
                                            [TIME] => 6/13/2013 12:45:30 PM
                                        )

                                    [8] => stdClass Object
                                        (
                                            [NAME] => Bound Brook
                                            [TIME] => 6/13/2013 12:52:00 PM
                                        )

                                    [9] => stdClass Object
                                        (
                                            [NAME] => Bridgewater
                                            [TIME] => 6/13/2013 12:54:45 PM
                                        )

                                    [10] => stdClass Object
                                        (
                                            [NAME] => Somerville
                                            [TIME] => 6/13/2013 12:59:30 PM
                                        )

                                    [11] => stdClass Object
                                        (
                                            [NAME] => Raritan
                                            [TIME] => 6/13/2013 1:10:00 PM
                                        )

                                )

                        )

                )

            [3] => stdClass Object
                (
                    [ITEM_INDEX] => 3
                    [SCHED_DEP_DATE] => 12:12:00 06/13/2013
                    [DESTINATION] => NY Penn -SEC
                    [TRACK] => 1
                    [LINE] => NJCL
                    [TRAIN_ID] => 3240
                    [STATUS] =>  
                    [BACKCOLOR] => black
                    [FORECOLOR] => white
                    [SHADOWCOLOR] => 
                    [GPSLATITUDE] => 
                    [GPSLONGITUDE] => 
                    [GPSTIME] => 6/13/2013 11:47:35 AM
                    [TRAIN_LINE] => North Jersey Coast Line
                    [STATION_POSITION] => 1
                    [LINEABBREVIATION] => NJCL
                    [INLINEMSG] => 
                    [STOPS] => stdClass Object
                        (
                            [STOP] => Array
                                (
                                    [0] => stdClass Object
                                        (
                                            [NAME] => Secaucus Upper Lvl
                                            [TIME] => 6/13/2013 12:19:30 PM
                                        )

                                    [1] => stdClass Object
                                        (
                                            [NAME] => New York Penn Station
                                            [TIME] => 6/13/2013 12:49:00 PM
                                        )

                                )

                        )

                )

            [4] => stdClass Object
... etc.
我试图避免或找到更好的方法,这样PHP代码看起来就不会像这样:

foreach ($destinations->ITEM as $key=>$destination) {
    echo $destination->DESTINATION . "\t\t";
    echo $destination->SCHED_DEP_DATE . "\n";
        foreach ($destination->STOPS as $key_stops=>$value_stops) {
            foreach ($value_stops as $key_stop=>$value_stop) {
                echo $value_stop->NAME . "\t";
                echo $value_stop->TIME . "\n";
            }
        }
    echo "\n";
    }
function printDestinationStop($stop) {
    echo $stop->NAME . "\t";
    echo $stop->TIME . "\n";
}

function printDestination($destination) {
    echo $destination->DESTINATION . "\t\t";
    echo $destination->SCHED_DEP_DATE . "\n";
    foreach ($destination->STOPS as $stop) {
        printDestinationStop($stop);
    }   
}

function printDestinations($destinations) {
    foreach ($destinations->ITEM as $destination) {
        printDestination($destination);
        echo "\n";
    }
}
更直接一些,也许像这样: $arrival\u time=$train\u destination($station->$last\u stop)


因此,可能建议使用的函数是更好的方法。

OOP非常适合将数据与行为联系起来。到目前为止,您所提到的只是需要访问数据。我不会通过创建对象来膨胀数据,除非您需要该功能。为了避免代码中出现嵌套循环,我将查询数据的逻辑移到数据库中(假设您有一个);无论是OOP还是非OOP,数据库在这方面都比命令式代码做得更好。

请考虑将代码分解为以下类型:

foreach ($destinations->ITEM as $key=>$destination) {
    echo $destination->DESTINATION . "\t\t";
    echo $destination->SCHED_DEP_DATE . "\n";
        foreach ($destination->STOPS as $key_stops=>$value_stops) {
            foreach ($value_stops as $key_stop=>$value_stop) {
                echo $value_stop->NAME . "\t";
                echo $value_stop->TIME . "\n";
            }
        }
    echo "\n";
    }
function printDestinationStop($stop) {
    echo $stop->NAME . "\t";
    echo $stop->TIME . "\n";
}

function printDestination($destination) {
    echo $destination->DESTINATION . "\t\t";
    echo $destination->SCHED_DEP_DATE . "\n";
    foreach ($destination->STOPS as $stop) {
        printDestinationStop($stop);
    }   
}

function printDestinations($destinations) {
    foreach ($destinations->ITEM as $destination) {
        printDestination($destination);
        echo "\n";
    }
}
这还使您可以打印任何特定的站点或目的地,而无需打印所有目的地(如给定的嵌套循环),因为打印特定元素的代码与主循环分离


更好的方法是提供一个用于打印的回调函数,这样数组/对象的遍历总是相同的,但根据打印位置的不同,许多输出格式都是可能的(有点像)。这不是已经是OOP了吗?我在那里看到对象(
stdClass对象
);包含对象数组的对象数组。那么“使用OO”是什么意思呢?有许多嵌套循环是糟糕编程的典型标志:将一些内部循环移动到函数(或那些对象的方法)。@eepp你给了我一些想法,我在上面补充道。顺便说一句,我不明白你为什么在问题中写JSON。JSON究竟涉及到哪里
print\u r
不输出JSON:它输出一些与JSON完全无关的PHP自定义
print\u r
格式。如果JSON在您的问题中不相关,也许您应该考虑删除其提及并更改问题标题。@ EEP与JSON相关,因为这是从SOAP请求中信封返回的数据结构的来源。我提到它是因为可能有一些上游方法来处理我不知道的所有这些。谢谢你的洞察力。这些数据来自实时使用的SOAP提要,而不是来自我的数据库;我仍然坚持使用数据结构。我更喜欢C#开发人员,LINQ非常适合简洁地查询数据结构。有关此方法的PHP版本,请参阅。