1

我刚刚学会在 php 中使用双冒号。我有一个里面有很多功能的类:

class auth {

/* .... Other Functions ...*/

    public function logout ()
    {
        session_start();
        $_SESSION = array();
        if (ini_get("session.use_cookies")) {
            $params = session_get_cookie_params();
            setcookie(session_name(), '', time() - 42000,
                $params["path"], $params["domain"],
                $params["secure"], $params["httponly"]
            );
        }
        session_destroy();
    }

}

现在我将这个 auth.class.php 包含在另一个文件 logout.php 中,然后调用

auth::logout();

将 php 错误转为 E_ALL 级别时,我没有发现任何错误(除了:“header already sent” )。

我听说范围解析运算符仅适用于静态函数。所以我很困惑,请帮助我更好地理解它......请

4

6 回答 6

3

您可以以静态方式调用非静态函数(就像您一样)。相信 PHP 5.3 会更严格一些,但它仍然是可能的。在这种情况下,它不会出现任何问题,因为您的函数不引用对象本身的任何变量,因此它实际上并不依赖于对象实例。因此你不会得到任何错误。

但是,我仍然建议不要这样做。您的代码会变得混乱,并且可能(并且应该)在未来的版本中中断。

于 2012-04-19T07:52:17.380 回答
0

session_start();应该是您的引导/初始化代码的一部分,而不是 auth 类的一部分。将它放在项目中执行的第一行的某个位置。如果您在调用 session_start() 之前输出 ANYTHING,您将收到 headers already sent 错误,并且结果将是不可预测的。

于 2012-04-19T07:48:08.050 回答
0

logout()你静态地调用你的方法。因此,您需要在static方法定义中添加关键字,例如public static function logout().

header already sent错误表明您在发送 Real 标头之前已将一些数据输出到浏览器。可能是一些 php 输出或错误。

于 2012-04-19T07:48:53.143 回答
0

PHP 在静态与非静态方法方面非常松懈。如果您在 php 配置中打开严格模式,这将是错误的。

另外:“PHP 4 没有静态关键字(在函数声明上下文中),但仍然允许使用 :: 静态调用方法。为了向后兼容的目的,这在 PHP 5 中继续存在。”

另请参阅:使用“::”调用非静态方法

于 2012-04-19T07:49:12.640 回答
0

这与您的session_start(). 您必须在任何输出到浏览器之前
执行此函数(可能是模板、回显甚至是之前的空白)。<?php

您可能在每次页面加载时都需要它,所以我建议您将它放在一开始加载的配置文件中的某个位置。

于 2012-04-19T07:46:06.193 回答
0

首先,您正在使用仅适用于静态函数的范围解析运算符。您必须在 public 之后使用 static 关键字将此函数设为静态,然后您可以使用其类名调用您不必制作该类的对象,或者您可以制作这样的对象

<?php 
     $myobject    = new myclass();
?>

一个主要的认为 session_start(); 函数应该是您网页的第一行,因为它将标头信息发送到服务器。服务器保存它们。否则使用 php 函数重新发送标头信息将是一个问题,因为每个 htm 总是向服务器发送一个 http 标头信息,因此 session_start 应该是任何页面的第一行

如果这与您相关,您可以在 info.gtensoft.in 上给我发邮件,Gtensoftwares 高级开发人员 www.gtensoft.in 来自印度新德里

于 2012-04-19T08:44:06.183 回答