本问题已经有最佳答案,请猛点这里访问。
在函数内部,我想返回一个超全局变量。它显示未定义。但当我在这个超级全局变量之前使用"@"时,它就完成了。我想知道"@"的实际用法。
下面是我的代码
public function getSession(){
return $_SESSION['login'];
}
你看的不对。
您不应该从类内访问php superglobals。相反,在代码的引导阶段创建实例时,应该将它们用作参数:
$request = new Request(
$_POST,
$_GET, new Session($_SESSION)
);
有点像这样。
然后将这个$request实例传递给处理用户输入的类。这有两个主要好处:
能够在运行时控制和更改感知的用户输入,并影响全局范围(在使用遗留代码库的情况下,其中部分代码仍然基于面向包含的编程)
能够独立于Web服务器测试代码
基本上,我认为Teresko指出在OOP中,在本例中,您需要围绕您的请求进行抽象(因此它是可测试的)。而且,因为您通常会在撰写根目录中撰写此对象,所以应用程序的其余部分将使用此请求对象,而不使用超全局。
在PHP中使用@有一些很好的用例。
一个很好的例子是,如果您正在编写面向对象的代码,并且您想要一个干净的对象API,在出现问题时抛出异常。你在设计你的类,你的对象执行,比如说,一个file_get_contents调用。为了维护一个好的、自包含的对象API,您需要在出现问题时抛出一个异常。
在这里为@加前缀可以禁止警告并确保此对象的用户获得异常。相反,检查一个false,然后抛出异常。
你为什么要这么做?因为php是一个愚蠢的混合函数,在相互比较时没有相似性或标准。
对于您的具体示例(与@无关),您将执行isset($_SESSION['login'])。
这可以归结为:
"When is it okay to use @?"
答案是:实际上从来没有。
@操作符抑制错误,这是它唯一做的事情。基本上没有一种理智的情况是你永远不想隐瞒错误的。因为错误报告可以帮助您看到代码中的错误、错误、打字错误和错误假设。在这种情况下,您的代码假设$_SESSION['login']始终存在。这个假设显然是错误的,PHP会通知您。或者您的代码中有一个导致这个假设失败的错误,或者您需要使用isset($_SESSION['login'])来更改这个假设。
使用@的唯一合法理由是,如果您使用的是第三方代码,在第三方代码中,您期望出现错误,并且知道错误的含义,并且知道它们是无害的,并且不能以任何其他方式加以抑制。
使用第三方代码的@的唯一合法使用案例实际上是不正确的。等等,这不是已经发生了吗?D
@Jimbo如果将PHP标准库计算为第三方计数,听起来是正确的…
首先,没有必要仅仅因为一个超级的全球性的东西就归还一个超级的gloab。
public function Foo(){
$_SESSION['login'] .= $_SESSIN['login'] ." blah blah";
}
很好。
@用于关闭通知。这就是为什么当你使用它的时候,假设它起作用,因为你刚刚关掉了通知:)。$u会话仍然未定义。查看http://php.net/manual/en/language.operators.errorcontrol.php