Aar*_*ken 8 php global-variables superglobals
所以,我不是来自庞大的PHP背景 - 我想知道如果在格式良好的代码中,应该直接使用'superglobals',例如在某些函数的中间说$_SESSION['x'] = 'y';或者如果,就像我通常做的那样变量,最好将它们作为可以从那里使用的参数发送,例如:
class Doer {
private $sess;
public function __construct(&$sess) {
$this->sess =& $sess;
}
}
$doer = new Doer($_SESSION);
Run Code Online (Sandbox Code Playgroud)
然后使用Doer->sessDoer中的版本等.(这种方法的优点在于它明确表示Doer使用$ _SESSION.)
这个问题的PHP设计方法是什么?
gro*_*gel 13
我不喜欢包装$_SESSION,$_POST,$_GET,和$_COOKIE成面向对象的结构.
我使用这种方法来集中处理卫生和验证的代码,所有必要的isset ()检查,随机数,setcookie参数等.它还允许客户端代码更具可读性(并且让我觉得它更易于维护).
可能难以强制使用这种结构,尤其是在存在多个编码器的情况下.使用$_GET,$_POST和$_COOKIE(我相信),您的初始化代码可以复制数据,然后销毁超全局.也许一个聪明的析构函数可以使用$ _SESSION(在加载时擦除$ _SESSION,在析构函数中写回),尽管我没有尝试过.
但是,我通常不会使用任何这些强制技术.习惯了之后,$_SESSION在会话类之外的代码中查看看起来很奇怪,而且我主要是单独工作.
编辑
这是一些示例客户端代码,以防它帮助某人.我敢肯定,任何一个主要的框架都会给你更好的想法......
$post = Post::load ();
$post->numeric ('member_age');
$post->email ('member_email');
$post->match ('/regex/','member_field');
$post->required ('member_first_name','member_email');
$post->inSet ('member_status',array('unemployed','retired','part-time','full-time'));
$post->money ('member_salary');
$post->register ('member_last_name'); // no specific requirements, but we want access
if ($post->isValid())
{
// do good stuff
$firstName = $post->member_first_name;
}
else
{
// do error stuff
}
Run Code Online (Sandbox Code Playgroud)
Post及其朋友都派生自一个实现核心验证代码的基类,添加自己的特定功能,如表单令牌,会话cookie配置等等.
在内部,该类包含一系列有效数据,这些数据$_POST在调用验证方法时从中提取,然后使用魔术__get方法将它们作为属性返回.无法以这种方式访问失败的字段.我的验证方法(除外required)在空字段上不会失败,并且其中许多方法func_get_args用于允许它们一次在多个字段上操作.某些方法(如money)会自动将数据转换为自定义值类型.
在错误的情况下,我有办法将数据转换为可以保存在会话中的格式,并用于预先填充表单并在重定向到原始表单后突出显示错误.
改进这一点的一种方法是将验证信息存储在Form类中,该类用于呈现表单并为客户端验证提供支持,以及在提交后清理数据.