来自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。
模糊的问题,我知道。有人能指出我正确的方向吗?
答案 0 :(得分:0)
在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();
答案 1 :(得分:-1)
不幸的是,那里的所有教程都没有显示如何嵌套 多个对象,比如我上面的javascript示例。
这是因为你无法在PHP中定义嵌套对象。
但是,您可以多次扩展一个类,可以使用namespaces,如果需要多重继承,Traits可以让您这样做。
此外,方法链接也可以通过在类方法结束时返回对象实例来实现。更多信息:How to create a fluent query interface?