【问题标题】:PHP: Proceedural code - use namespace or array of closures to avoid polluting global namespace?PHP:程序代码 - 使用命名空间或闭包数组来避免污染全局命名空间?
【发布时间】:2016-03-10 01:32:46
【问题描述】:

我刚刚开始编写一个以程序方式编写的开源软件,作为 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 我不同意仅仅因为“一堆打字”而排除命名空间。我认为这些名称增加了代码的清晰度,如果您使用的是带有名称建议/完成的编辑器,您应该这样做。

标签: php namespaces closures procedural


【解决方案1】:

您当然可以将命名空间用于过程代码。查看文档以了解其工作原理:http://php.net/manual/en/language.namespaces.basics.php

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

【讨论】:

  • 谢谢。命名空间听起来是个好主意,除了....(继续思考)。我想我需要把我在这里做的事情分开。项目设置和内部代码可以命名空间。但是对于人们需要使用的东西.. 例如命名空间 \MyApp\Db\Mysql 每次他们需要函数 \MyApp\Db\Mysql\Query(); 时都很难输入。有很多要打字的。也许内部交易/设置可以命名空间,而最终用户使用的东西不能。 Idk,我必须思考。我想我想如何设计这个。对于这个过早的问题,我很抱歉。
  • 我想通了。由于我强迫这个项目是程序性的,我将不得不接受它的缺点。如果我命名空间,用户将不得不为每个函数调用键入太多(就像我说的,例如 \MyApp\Db\Mysql\Query())。如果我使用一个闭包数组,它最终可能是一个巨大的数组,有一些 vars/functions 可用或不可用,这取决于文件是否被包含(比如 db vars/functions 如果我不包含db 文件)。此外,程序编码器的奇怪语法($myApp['db']['query']($params))。我会坚持使用前缀(只是 MyApp_Db_Query($params))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 2015-03-05
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 2020-01-03
相关资源
最近更新 更多