PHP:Procedural代码-使用名称空间或闭包数组来避免污染全局名称空间?

PHP:Procedural代码-使用名称空间或闭包数组来避免污染全局名称空间?,php,namespaces,closures,procedural,Php,Namespaces,Closures,Procedural,我刚刚开始编写一个开源软件,它是作为OOP mvc框架/框架的替代品按程序编写的。因此,虽然我可以编写自己的OOP MVC框架,但目的是按程序完成所有工作。这是为了学习目的,也是为了在做新项目时准备好DIY代码库。我还没有完全精通OOP,所以我觉得这样做是朝着这个方向迈出的一步。然而,这个项目的目的是作为一个程序性的替代方案,所以它必须按程序编写(我给出这个前言是为了避免使用OOP的答案) 在开始编写之后,我意识到该代码正在大量污染全局名称空间(就像过程代码惯常做的那样) 首先,为了解决污染全局

我刚刚开始编写一个开源软件,它是作为OOP mvc框架/框架的替代品按程序编写的。因此,虽然我可以编写自己的OOP MVC框架,但目的是按程序完成所有工作。这是为了学习目的,也是为了在做新项目时准备好DIY代码库。我还没有完全精通OOP,所以我觉得这样做是朝着这个方向迈出的一步。然而,这个项目的目的是作为一个程序性的替代方案,所以它必须按程序编写(我给出这个前言是为了避免使用OOP的答案)

在开始编写之后,我意识到该代码正在大量污染全局名称空间(就像过程代码惯常做的那样)

首先,为了解决污染全局名称空间和最小化意外命名冲突的问题,我决定对使用的变量和函数添加前缀,如下所示:

$prefix_variableName='value'
prefix_functionName($var){return$var;}

然后我意识到有更好的方法可以做到这一点。我有两个想法:

1:创建闭包的全局数组。这样,我在代码中设置的唯一全局数组就是单个数组。。就这样

$myApp = array(
    'var1' => 'value1',
    'var2' => 'value2',
    'function1' => function($var1){ return $var1; },
    'function2' => function($var2){ return $var2; }
//etc
);
2:在每个文件的顶部为全局代码创建名称空间。。像

namespace myApp;

$var1 = 'value1';
function1($msg){ return $msg; }

这两种选择都可能吗?过程代码可以命名吗?在这种情况下,哪一个是更好的选择,为什么?还有其他选择吗?

您当然可以将名称空间用于过程代码。查看文档以了解其工作原理:


您应该始终为代码命名名称空间,以防止冲突。使用闭包数组可能会产生不必要的行为,比如让用户能够取消设置全局数组中的值,以及预期会出现可调用错误的代码。

“我想编写一个非OO项目”[继续重新创建PHP OO]您遇到的问题正是OO的原因。我曾经创建了一个名为getResource的函数。它接受一个键(字符串),声明了一个静态数组,如果该键不在数组中,则返回false。@sammitch,您是正确的。但是,如果可以的话,我仍然可以编写过程代码并尽量避免出现问题,对吗?代码将是非面向对象的,同时最大限度地避免问题。这当然是一个障碍,但它是达到预期目的所必需的。我的项目将面向那些想要编写过程化的或不知道OO的人(我希望我能得到类似的东西)。事实上,@sammitch,你是对的。如果我想写一个程序性的项目,我必须接受随之而来的问题。我想我会坚持使用前缀,因为这是最好的解决方案。如果我使用了名称空间,那么键入长函数名和查找名称空间名(例如\MyApp\Db\Mysql\Query())会让事情变得更加困难,而且实际上只是在一个奇怪的过程设置中推动OOP实践。如果我使用闭包数组,我只有一个全局变量,但是MyApp使用的每个变量和函数都可以在每个页面上使用。我会坚持使用前缀。@Scott我不同意仅仅因为“大量键入”就排除名称空间。我认为这些名字使代码更加清晰,如果你正在使用一个有名字建议/完成的编辑器,你应该这样做。谢谢。名称空间听起来是个好主意,除了。。。。(思想还在继续)。我想我需要把我在这里做的事情分开。项目设置和内部代码可以使用名称空间。但是对于人们需要使用的东西。。例如namespace\MyApp\Db\Mysql在每次需要函数\MyApp\Db\Mysql\Query()时都很难输入;要打字的话太多了。也许内部交易/设置可以命名,最终用户使用的东西不能命名。Idk,我得想想。我想知道我想怎么设计这个。我很抱歉问得太早了,我知道了。因为我强迫这个项目是程序性的,所以我不得不接受它的缺点。如果我使用名称空间,用户将不得不为每个函数调用键入太多内容(如我所说,例如.\MyApp\Db\Mysql\Query())。如果我使用一个闭包数组,它可能会变成一个巨大的数组,有一些变量/函数可用或不可用,这取决于文件是否包含(比如如果我没有包含db文件,db变量/函数就不存在)。另外,程序编码器的奇怪语法($myApp['db']['query']($params))。我将坚持使用前缀(仅使用MyApp_Db_Query($params))。