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

时间:2016-07-19 07:35:55

标签: php

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

下面是我的代码

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

4 个答案:

答案 0 :(得分:9)

在PHP中使用@一些好用例。

一个很好的例子是,如果你正在编写面向对象的代码,并且你想要一个干净的对象api,它会在出现问题时抛出异常。你正在设计你的课程,而你的对象在那里执行file_get_contents调用。为了维护一个漂亮的,自包含的对象api,你会想要在出现问题时抛出异常。

@file_get_contents(...)

@前加上允许您取消the warning并确保此对象的用户获得异常。相反,检查false然后抛出异常。

你为什么要这样做?因为php是一种愚蠢的功能组合,在相互比较时没有相似之处或标准。

根据您与@无关的具体示例,您需要执行isset($_SESSION['login'])

答案 1 :(得分:9)

你正在以错误的方式看待这个问题。

您永远不应该从类中开始访问PHP超级全局。相反,在代码的引导阶段创建实例时,应将它们用作参数:

$request = new Request(
    $_POST, 
    $_GET, new Session($_SESSION)
);

有点像这样。

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

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

答案 2 :(得分:2)

归结为:

  

“什么时候可以使用@?”

答案是:几乎从不。

@运算符可以抑制错误,这是它唯一能做的事情。基本上没有理智的情况,你曾经想要压制错误。因为错误报告可以帮助您在代码中看到错误,错误,拼写错误,错误的假设。在这种情况下,您的代码假设$_SESSION['login']始终存在。这个假设显然是错误的,PHP会通知你。您的代码中存在导致此假设失败的错误,或者您需要使用isset($_SESSION['login'])更改假设。

使用@的唯一合法案例是,如果您正在使用第三方代码,而期望错误并知道它们的含义并知道它们是无害的且无法抑制任何其他方式。

答案 3 :(得分:0)

首先,没有必要仅仅因为它的超级全球性,就像这样返回一个超级魅力

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

很好。

@用于关闭通知。这就是为什么你使用它假设它的工作,因为你刚刚关闭通知:)。 $ _SESSION仍未定义。看看http://php.net/manual/en/language.operators.errorcontrol.php