何时在面向对象的php中使用超级全局变量中的’@’?


when to use '@' before in a super global variable in object oriented php?

本问题已经有最佳答案,请猛点这里访问。

在函数内部,我想返回一个超全局变量。它显示未定义。但当我在这个超级全局变量之前使用"@"时,它就完成了。我想知道"@"的实际用法。

下面是我的代码

1
2
3
public function getSession(){
       return $_SESSION['login'];  
   }

你看的不对。

您不应该从类内访问php superglobals。相反,在代码的引导阶段创建实例时,应该将它们用作参数:

1
2
3
4
$request = new Request(
    $_POST,
    $_GET, new Session($_SESSION)
);

有点像这样。

然后将这个$request实例传递给处理用户输入的类。这有两个主要好处:

  • 能够在运行时控制和更改感知的用户输入,并影响全局范围(在使用遗留代码库的情况下,其中部分代码仍然基于面向包含的编程)
  • 能够独立于Web服务器测试代码


在PHP中使用@有一些很好的用例。

一个很好的例子是,如果您正在编写面向对象的代码,并且您想要一个干净的对象API,在出现问题时抛出异常。你在设计你的类,你的对象执行,比如说,一个file_get_contents调用。为了维护一个好的、自包含的对象API,您需要在出现问题时抛出一个异常。

在这里为@加前缀可以禁止警告并确保此对象的用户获得异常。相反,检查一个false,然后抛出异常。

你为什么要这么做?因为php是一个愚蠢的混合函数,在相互比较时没有相似性或标准。

对于您的具体示例(与@无关),您将执行isset($_SESSION['login'])


这可以归结为:

"When is it okay to use @?"

答案是:实际上从来没有。

@操作符抑制错误,这是它唯一做的事情。基本上没有一种理智的情况是你永远不想隐瞒错误的。因为错误报告可以帮助您看到代码中的错误、错误、打字错误和错误假设。在这种情况下,您的代码假设$_SESSION['login']始终存在。这个假设显然是错误的,PHP会通知您。或者您的代码中有一个导致这个假设失败的错误,或者您需要使用isset($_SESSION['login'])来更改这个假设。

使用@的唯一合法理由是,如果您使用的是第三方代码,在第三方代码中,您期望出现错误,并且知道错误的含义,并且知道它们是无害的,并且不能以任何其他方式加以抑制。


首先,没有必要仅仅因为一个超级的全球性的东西就归还一个超级的gloab。

1
2
3
public function Foo(){
    $_SESSION['login'] .= $_SESSIN['login'] ." blah blah";
}

很好。

@用于关闭通知。这就是为什么当你使用它的时候,假设它起作用,因为你刚刚关掉了通知:)。$u会话仍然未定义。查看http://php.net/manual/en/language.operators.errorcontrol.php