何时使用'@';在面向对象php中的超级全局变量之前?
在函数中,我想返回一个超全局变量。它显示未定义的。但当我在这个超全局变量前面使用“@”时,它就完成了。我想知道@的实际用法 下面是我的代码何时使用'@';在面向对象php中的超级全局变量之前?,php,Php,在函数中,我想返回一个超全局变量。它显示未定义的。但当我在这个超全局变量前面使用“@”时,它就完成了。我想知道@的实际用法 下面是我的代码 public function getSession(){ return $_SESSION['login']; } 首先,没有必要仅仅因为一个超级gloab是超全局的,就返回一个超级gloab public function Foo(){ $_SESSION['login'] .= $_SESSIN['login'] .
public function getSession(){
return $_SESSION['login'];
}
首先,没有必要仅仅因为一个超级gloab是超全局的,就返回一个超级gloab
public function Foo(){
$_SESSION['login'] .= $_SESSIN['login'] . " blah blah";
}
很好
@
用于关闭通知。这就是为什么你用它的时候假设它工作,因为你刚刚关掉了通知:)。$\u会话仍未定义。请看一看首先,没有必要仅仅因为超级gloab的超全局性而返回它
public function Foo(){
$_SESSION['login'] .= $_SESSIN['login'] . " blah blah";
}
很好
@
用于关闭通知。这就是为什么你用它的时候假设它工作,因为你刚刚关掉了通知:)。$\u会话仍未定义。看看这可以归结为:
“何时可以使用@
?”
答案是:几乎从来没有。
@
操作符抑制错误,这是它唯一能做的事情。基本上没有一种理智的情况下你会想要抑制错误。因为错误报告可以帮助您看到代码中的错误、错误、打字错误和错误假设。在这种情况下,您的代码假设$\u会话['login']
始终存在。这种假设显然是错误的,PHP会通知您。您的代码中存在导致该假设失败的错误,或者您需要使用isset($\u SESSION['login'])
更改该假设
使用@
的唯一合法理由是,如果您使用的是第三方代码,您预期会出现错误,并且知道这些错误的含义,并且知道它们是无害的,并且无法以任何其他方式抑制。这归结为:
“何时可以使用@
?”
答案是:几乎从来没有。
@
操作符抑制错误,这是它唯一能做的事情。基本上没有一种理智的情况下你会想要抑制错误。因为错误报告可以帮助您看到代码中的错误、错误、打字错误和错误假设。在这种情况下,您的代码假设$\u会话['login']
始终存在。这种假设显然是错误的,PHP会通知您。您的代码中存在导致该假设失败的错误,或者您需要使用isset($\u SESSION['login'])
更改该假设
使用@
的唯一合法理由是,如果您使用的是第三方代码,您预期会出现错误,并且知道这些错误的含义,并且知道它们是无害的,并且无法以任何其他方式抑制。在PHP中使用@
有一些很好的用例
一个很好的例子是,如果您正在编写面向对象的代码,并且希望有一个干净的对象api,在出现问题时抛出异常。你在设计你的类,你的对象执行,比如说,一个file\u get\u contents
调用。为了维护一个良好的、自包含的对象api,您需要在出现问题时抛出异常
@file_get_contents(...)
在@
前面加前缀可以禁止并确保此对象的用户获得异常。相反,检查false
,然后抛出异常
你为什么要这么做?因为php是一个愚蠢的混合函数,在相互比较时没有相似之处或标准
使用与
@
无关的特定示例,您需要执行isset($\u SESSION['login'])
在PHP中使用@
有一些很好的用例
一个很好的例子是,如果您正在编写面向对象的代码,并且希望有一个干净的对象api,在出现问题时抛出异常。你在设计你的类,你的对象执行,比如说,一个file\u get\u contents
调用。为了维护一个良好的、自包含的对象api,您需要在出现问题时抛出异常
@file_get_contents(...)
在@
前面加前缀可以禁止并确保此对象的用户获得异常。相反,检查false
,然后抛出异常
你为什么要这么做?因为php是一个愚蠢的混合函数,在相互比较时没有相似之处或标准
使用与
@
无关的特定示例,您需要执行isset($\u SESSION['login'])
你看得不对
您不应该从类内部访问PHP superglobals。相反,在代码的引导阶段创建实例时,应将它们用作参数:
$request = new Request(
$_POST,
$_GET, new Session($_SESSION)
);
有点像这样
然后将此$request
实例传递给处理用户输入的类。这有两大好处:
- 能够在运行时控制和更改感知的用户输入,并影响全局范围(当您在遗留代码库中工作时,其中部分代码库仍然基于面向包含的编程)
- 能够独立于Web服务器测试代码
- 你看得不对
您不应该从类内部访问PHP superglobals。相反,在代码的引导阶段创建实例时,应将它们用作参数:
$request = new Request(
$_POST,
$_GET, new Session($_SESSION)
);
有点像这样
然后将此$request
实例传递给处理用户输入的类。这有两大好处:
- 能够在运行时控制和更改感知到的用户输入,并影响全局范围(当您在遗留代码库中工作时,其中部分代码仍然基于