何时在面向对象的 php 中的超级全局变量中使用“@”? [复制]

Posted

技术标签:

【中文标题】何时在面向对象的 php 中的超级全局变量中使用“@”? [复制]【英文标题】:when to use '@' before in a super global variable in object oriented php? [duplicate] 【发布时间】:2016-11-21 23:23:17 【问题描述】:

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

下面是我的代码

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

【问题讨论】:

【参考方案1】:

首先,没有必要仅仅因为它的超级全局变量像这样就返回一个超级全局变量

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

没问题。

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

【讨论】:

【参考方案2】:

这归结为:

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

答案是:几乎没有。

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

使用@ 的唯一合法情况是,如果您正在使用第 3 方代码,您预计会出现错误并知道它们的含义,并且知道它们是无害的,并且不能被其他任何方式抑制方式。

【讨论】:

@ 使用第三方代码的唯一合法用例实际上是不正确的。 等等,这不是已经发生了吗? :D @Jimbo 如果您将 PHP 标准库算作 3rd 方,那听起来是对的……【参考方案3】:

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

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

@file_get_contents(...)

在那里添加@ 前缀可以让您抑制the warning 并确保该对象的用户获得异常。相反,检查 false 然后抛出你的异常。

为什么你必须这样做?因为 php 是一个愚蠢的函数组合,相互比较时没有相似之处或标准。


对于与@ 无关的具体示例,您可以使用isset($_SESSION['login'])

【讨论】:

【参考方案4】:

你看错了。

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

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

有点像这样。

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

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

【讨论】:

基本上我认为 Teresko 指出在这种情况下,在 OOP 中,您需要围绕您的请求进行抽象(因此它是可测试的)。而且因为您通常会在您的组合根中组合这个对象,所以您的应用程序的其余部分将使用这个 Request 对象而不是超全局变量。

以上是关于何时在面向对象的 php 中的超级全局变量中使用“@”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PHP超级全局变量魔术变量和魔术函数

PHP超级全局变量魔术变量和魔术函数

PHP超级全局变量魔术变量和魔术函数

PHP超级全局变量魔术变量和魔术函数

PHP超全局变量

PHP中的超级全局变量