PHP 面向对象 全局数组,何时在面向对象的php中使用超级全局变量中的’@’?

本文探讨了在PHP中如何正确使用超全局变量,尤其是$_SESSION,以及错误控制运算符@的作用。作者建议避免直接在类内部使用超全局变量,而是通过构造函数传递它们。同时,@运算符用于抑制错误,但通常不推荐使用,因为它隐藏了可能存在的问题。文章强调了良好的编程实践,如使用isset()检查变量是否存在,以及在面向对象编程中创建可测试的请求抽象。
摘要由CSDN通过智能技术生成

本问题已经有最佳答案,请猛点这里访问。

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

下面是我的代码

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值