为什么我无法访问“newSession”函数中的“incSessionCount”函数?
class Session {
private $_num_session = 0;
private function incSessionCount() {
$this->_num_session++;
}
public static function newSession($key, $value) {
if( !isset( $_SESSION[$key] ) ) {
$_SESSION[$key] = $value;
$this->incSessionCount();
return true;
} else {
return false;
}
}
}
我刚玩过,就像制作incSessionCount()
public
等等......
然后我想,当它被设置为private
...
有可能,我错过了一篇有用的文章,应该对我有所帮助,但最后我终于要求了。
那么为什么这不起作用?
答案 0 :(得分:6)
问题是您的newSession
是static
,因此您不应该从中调用实例方法。
答案 1 :(得分:2)
我想你是想做的:
Session::newSession($key, $value);
而不是
$session = new Session();
$session->newSession($key, $value);
错误不是因为您从公共方法中调用私有方法,而是因为您使用的是$this
而不是self
。
$this
特殊变量表示当前实例对象,而self
表示类本身。
答案 2 :(得分:1)
如果启用错误显示并将错误报告级别设置为E_ALL
,您将看到问题是在错误的上下文中使用$this
。
请参阅以下这些小修改以执行您想要的操作,并查看有关
的相关页面class Session {
private $_num_session = 0;
private static $inst = null;
public static function instance(){
if (!static::$inst)
static::$inst = new Session();
return static::$inst;
}
private function incSessionCount() {
$this->_num_session++;
}
public static function newSession($key, $value) {
if( !isset( $_SESSION[$key] ) ) {
$_SESSION[$key] = $value;
Session::getInstance()->incSessionCount();
return true;
} else {
return false;
}
}
}
您可以在互联网上查找设计模式和单例,并使用magic __clone()禁止多个实例
我只找到了德文版的文档,我不知道为什么:http://de.php.net/manual/de/language.oop5.patterns.php
编辑:查看有关设计模式的链接:http://www.phptherightway.com/pages/Design-Patterns.html
答案 3 :(得分:0)
请注意,static
方法与class
绑定。非静态方法与实例绑定(当您执行$instance = new MyClass();
之类的操作时)。但是当您在静态上下文中调用某些内容时,您不必拥有任何实例。
当你想在实例($this
)上调用某些内容时,它是相同的,因为在静态上下文中不存在任何实例。
答案 4 :(得分:-1)
问题是public
方法是static
,并且您正在尝试将方法用于实例化对象。在静态方法中,$this
变量仅引用其他静态方法和属性。