【问题标题】:How to visualize a collection of functions in a PHP nested array/object如何可视化 PHP 嵌套数组/对象中的函数集合
【发布时间】:2017-02-21 11:22:40
【问题描述】:

来自 javascript,我习惯于将所有函数嵌套在对象中,如下所示:

var app = {
    something: {
        something: {
            some_variable:"something",
            something: function() {
                return this.some_variable;
            }
        }
    }
};
console.log(app.something.something.something()); // "something"

这是保持所有函数分类和逻辑命名的好方法(对我而言)。

在 PHP 中,我一直在使用数组来执行此操作:

$app=[
    "name"=>"my_app",
    "database"=>[
        "password"=>"497624779",
        "connect"=>function(){
            //connect to db here using $GLOBALS["app"]["database"]["password"]
        },
        "update"=>function(){
            //update records, etc
        }
    ],
    "page"=>[
        "data"=>[
            "page_1"=>[
                "title"=>"Home",
                "icon"=>"",
                "etc"=>""
            ],
            "page_2"=>[
                "title"=>"",
                "icon"=>"",
                "etc"=>""
            ],
            "page_3"=>[
                "title"=>"",
                "icon"=>"",
                "etc"=>""
            ]
        ],
        "loading"=>function($page_name){
            return $GLOBALS["app"]["page"]["data"][$page_name]["title"]." is loading...";
        }
    ]
];

这意味着我可以这样做:

$app["database"]["connect"]();
echo $app["page"]["loading"]("page_1"); // "Home is loading..."

我如何将它迁移到使用对象以便我可以做到这一点:

$app->database->connect(); // connect function would use $this->password, not GLOBALS
$app->page->loading("page_1");

不幸的是,那里的所有教程都没有显示如何嵌套多个对象,例如我上面的 javascript 示例。我喜欢用于可视化的数组的树状结构,但我找不到以这种方式定义对象的方法 - 只有这样的示例:

$app=new stdClass();
$app->database=new stdClass();
$app->database->password="497624779";
//etc

即,根本不是很直观。如果我以这种方式重构所有代码,我会迷失在其中,除非我定期对对象执行 var_dump。

模糊的问题,我知道。谁能指出我正确的方向?

【问题讨论】:

  • 你用来创建原型对象。您不习惯从类定义中以面向对象的模式工作。单独定义每个类,将它们中的每一个保存在自己的文件中。不要试图把所有东西都放在一个大的地方。另外,请阅读依赖注入。
  • 并避免使用stdClass。定义你自己的类。

标签: php function object multidimensional-array


【解决方案1】:

在 PHP 中,您应该使用命名空间和类来组织代码。

命名空间:http://php.net/manual/en/language.namespaces.php

\some\name\space\class::staticMethod()

类和对象:http://php.net/manual/en/language.oop5.php

$obj = \some\name\space\class();
$obj->someMethod();

【讨论】:

  • 嗨。我查看了命名空间,但当我尝试像这样嵌套它们时出现错误:namespace app{namespace {database}}。我希望这会变成\app\database::connect() 或类似的
  • php.net/manual/en/language.namespaces.basics.php in file2.php 示例正是您正在寻找的。你读过这个php.net/manual/en/language.namespaces.nested.php 吗?
  • 好的,所以也许命名空间是前进的方向,但它们令人沮丧。我只是无法想象它们。有没有办法像我上面的树结构一样定义它们?或者至少以标准方式定义它们,但将 view 类/命名空间定义为树结构?我所关心的只是能够看到代码适合项目的位置。不幸的是,在课堂上使用 var_dump 不会显示任何“孩子”。
【解决方案2】:

很遗憾,所有的教程都没有展示如何嵌套 多个对象,例如我上面的 javascript 示例。

这是因为你不能在 PHP 中定义嵌套对象。

但是,您可以多次扩展一个类,您可以使用namespaces,如果您需要多重继承,Traits 可以让您这样做。

此外,如果类方法返回对象实例,方法链接也是合理的。更多信息在这里:How to create a fluent query interface?

【讨论】:

  • 特征看起来确实不错。我刚刚对关于可视化的另一个答案发表了另一条评论。我想我想以树形结构查看代码。如果我走这条路,有没有办法让 PHP 吐出所有这些对象/关系的逻辑结构,以便我可以以树格式查看它?
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 2021-09-22
  • 2015-08-19
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
相关资源
最近更新 更多