【发布时间】: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