Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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中的超级全局变量之前?_Php - Fatal编程技术网

何时使用'@';在面向对象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
      实例传递给处理用户输入的类。这有两大好处:

      • 能够在运行时控制和更改感知到的用户输入,并影响全局范围(当您在遗留代码库中工作时,其中部分代码仍然基于