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

ash*_*hik 1 php

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

下面是我的代码

public function getSession(){
       return $_SESSION['login'];  
   }
Run Code Online (Sandbox Code Playgroud)

Jim*_*mbo 9

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

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

@file_get_contents(...)
Run Code Online (Sandbox Code Playgroud)

@那里添加前缀允许您禁止警告并确保此对象的用户获得异常.相反,请检查false然后抛出异常.

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


有了你的具体例子,这与@你无关isset($_SESSION['login']).


ter*_*ško 9

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

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

$request = new Request(
    $_POST, 
    $_GET, new Session($_SESSION)
);
Run Code Online (Sandbox Code Playgroud)

有点像这样.

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

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

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