Double Colon正在研究非静态功能

时间:2012-04-19 07:43:01

标签: php

我刚学会在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级别时,我没有发现任何错误(“标头已发送”)。

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

6 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

这更多地与您的session_start()有关 您必须在输出到浏览器之前执行此函数(可能是模板,回声甚至是<?php之前的空格)。

你可能在每次加载页面时都需要它,所以我建议你把它放在一开始就加载的配置文件中。

答案 2 :(得分:0)

session_start();应该是引导/初始化代码的一部分,而不是auth类的一部分。把它放在项目中执行的第一行的某个地方。如果在调用session_start()之前输出ANYTHING,则会发现标题已发送错误,结果将无法预测。

答案 3 :(得分:0)

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

header already sent错误表示您在发送Real标头之前向浏览器输出了一些数据。它可能是一些PHP输出或错误。

答案 4 :(得分:0)

PHP在静态与非静态方法上非常宽松。 如果在php配置中启用严格模式,则会出错。

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

另请参阅:Calling non static method with "::"

答案 5 :(得分:0)

首先,您使用的是范围分辨率运算符,它仅适用于静态函数。你必须在public之后使用static关键字使这个函数静态,然后你可以使用它的类名调用你不必创建该类的对象,或者你可以创建一个像这样的对象

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

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

如果这是相关的,你可以发送电子邮件至info.gtensoft.in Gtensoftwares的高级开发人员www.gtensoft.in来自印度新德尔吉