Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中直接使用超全局变量是好还是坏? P>所以,我不是来自一个巨大的PHP背景,我想知道如果在格式良好的代码中,应该直接使用“超全局”,例如在某个函数的中间说“代码> $ySale[’x'′=‘y’;或者,如果像我通常处理变量一样,最好将它们作为参数发送,可以从那里使用,例如: class Doer { private $sess; public function __construct(&$sess) { $this->sess =& $sess; } } $doer = new Doer($_SESSION);_Php_Global Variables_Superglobals - Fatal编程技术网

在PHP中直接使用超全局变量是好还是坏? P>所以,我不是来自一个巨大的PHP背景,我想知道如果在格式良好的代码中,应该直接使用“超全局”,例如在某个函数的中间说“代码> $ySale[’x'′=‘y’;或者,如果像我通常处理变量一样,最好将它们作为参数发送,可以从那里使用,例如: class Doer { private $sess; public function __construct(&$sess) { $this->sess =& $sess; } } $doer = new Doer($_SESSION);

在PHP中直接使用超全局变量是好还是坏? P>所以,我不是来自一个巨大的PHP背景,我想知道如果在格式良好的代码中,应该直接使用“超全局”,例如在某个函数的中间说“代码> $ySale[’x'′=‘y’;或者,如果像我通常处理变量一样,最好将它们作为参数发送,可以从那里使用,例如: class Doer { private $sess; public function __construct(&$sess) { $this->sess =& $sess; } } $doer = new Doer($_SESSION);,php,global-variables,superglobals,Php,Global Variables,Superglobals,然后使用Doer内部的Doer->sess版本等等。(此方法的优点是它清楚地表明,Doer使用$\u会话。) 对于这个问题,什么是公认的PHP设计方法?这不是PHP的好用途 直接获取$\u会话变量: $id = $_SESSION['id']; $hash = $_SESSION['hash']; 等等。我不建议通过引用传递superglobal。在您的类中,不清楚您所修改的是会话变量。此外,请记住,$\u课程在课堂之外的任何地方都可以使用。从面向对象的角度来看,通过修改与类无关的变量,从

然后使用Doer内部的
Doer->sess
版本等等。(此方法的优点是它清楚地表明,
Doer
使用$\u会话。)


对于这个问题,什么是公认的PHP设计方法?

这不是PHP的好用途

直接获取$\u会话变量:

$id   = $_SESSION['id'];
$hash = $_SESSION['hash'];

等等。

我不建议通过引用传递superglobal。在您的类中,不清楚您所修改的是会话变量。此外,请记住,$\u课程在课堂之外的任何地方都可以使用。从面向对象的角度来看,通过修改与类无关的变量,从类外部修改类内部的变量是错误的。有公共属性被认为是一个很差的实践,这是最坏的。

< P>我喜欢包装<代码> $yStudio,<代码> $POST ,<代码> $$GET,和<代码> $KOGII到OOP结构。

我使用这种方法来集中处理卫生和验证的代码,所有必要的
isset()
检查、nonce、
setcookie
参数等。它还允许客户端代码更具可读性(并使我产生一种更易维护的错觉)

强制使用这种结构可能很困难,特别是在有多个编码器的情况下。使用
$\u GET
$\u POST
$\u COOKIE
(我相信),您的初始化代码可以复制数据,然后销毁超全局。也许一个聪明的析构函数可以通过$\u会话实现这一点(加载时擦除$\u会话,将其写回析构函数),尽管我还没有尝试过

不过,我通常不会使用这些强制执行技术中的任何一种。习惯了之后,在SESSION类之外的代码中看到
$\u 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
}
Post及其好友都来自一个实现核心验证代码的基类,添加了自己的特定功能,如表单令牌、会话cookie配置等等

在内部,该类保存从调用验证方法时从
$\u POST
提取的有效数据集合,然后使用magic
\u get
方法将其作为属性返回。无法通过这种方式访问失败的字段。我的验证方法(除了
required
)不会在空字段上失败,其中许多方法使用
func\u get\u args
允许它们一次对多个字段进行操作。有些方法(如
money
)会自动将数据转换为自定义值类型

在这种错误情况下,我有一种方法可以将数据转换为一种格式,这种格式可以保存在会话中,用于预填充表单,并在重定向到原始表单后突出显示错误


对此进行改进的一种方法是将验证信息存储在表单类中,该表单类用于呈现表单并支持客户端验证,以及在提交后清理数据。

修改超全局的内容被认为是一种糟糕的做法。虽然没有什么真正的错误,尤其是如果代码是100%在你的控制下,它可能会导致意想不到的副作用,尤其是当你考虑混合源代码。例如,如果您这样做:

$_POST['someval'] = mysql_real_escape_string($_POST['someval']);
function get( $key, $default=FALSE ){
    return (isset($_GET[$key]) ? $_GET[$key]:$default);
}
function post( $key, $default=FALSE ){
    return (isset($_POST[$key]) ? $_POST[$key]:$default);
}
function session( $key, $default=FALSE ){
    return (isset($_SESSION[$key]) ? $_SESSION[$key]:$default);
}
$page = get('p', 'start');

$first_name = post('first_name');
$last_name = post('last_name');
$age = post('age', -1);
您可能期望PHP提供的“someval”的任何地方也会发生变化,但事实并非如此。
$\u请求['someval']
中的副本将保持不变,仍然是原始的“不安全”版本。如果您在$\u POST上执行所有转义操作,但稍后的库使用$\u请求并假定它已经转义,则这可能会导致意外的注入漏洞


因此,即使可以修改它们,也最好将超全局变量视为只读。如果您必须处理这些值,请维护您自己的并行副本,并执行维护该副本所需的任何包装器/访问方法。

我知道这个问题很老,但我想补充一个答案

mario处理输入的类非常棒

我更喜欢用某种方式包装超球。它可以使您的代码更易于阅读,并带来更好的可维护性

例如,在我目前的工作中,有一些代码是我讨厌的!会话变量的使用非常频繁,以至于您无法在不严重影响整个站点的情况下实际更改实现

比如说,

假设您创建了一个特定于应用程序的会话类

class Session
{
    //some nice code
}
你可以这样写

$session = new Session();
if( $session->isLoggedIn() )
{
   //do some stuff
}
与此相反,

if( $_SESSION['logged'] == true )
{
   //do some stuff
}
这看起来有点琐碎,但对我来说却是件大事。假设将来某个时候我决定将索引的名称从“logged”更改为“loggedIn”

我现在必须去应用程序中的每个地方,会话变量用于更改此设置。或者,我可以离开它,找到一些方法来维护这两个变量

或者,如果我想检查该用户是否为管理员用户并已登录,该怎么办?为此,我可能会在会话中检查两个不同的变量。但是,我可以将其封装到一个方法中,并缩短代码

这有助于其他程序员查看您的代码,因为它更易于阅读,而且在查看代码时,他们不必“思考”太多。他们可以转到该方法,看到只有一种方法可以让用户登录。这对你也有帮助,因为如果你