我刚学会在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
答案 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中继续。”
答案 5 :(得分:0)
首先,您使用的是范围分辨率运算符,它仅适用于静态函数。你必须在public之后使用static关键字使这个函数静态,然后你可以使用它的类名调用你不必创建该类的对象,或者你可以创建一个像这样的对象
<?php
$myobject = new myclass();
?>
一位主要人士认为session_start();功能应该是您网页的第一行 因为它将头信息发送到服务器。和服务器保存它们。 否则,使用php函数重新发送头信息将是一个问题,因为每个htm总是向服务器发送一个http头信息 所以session_start应该是任何页面的第一行
如果这是相关的,你可以发送电子邮件至info.gtensoft.in Gtensoftwares的高级开发人员www.gtensoft.in来自印度新德尔吉