为什么我不能在我的"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
时,它一定是可以访问的......
错过了一篇有用的文章,这应该对我有所帮助,但最终我还是问了。
那么为什么这不起作用呢?
问题是你的newSession
是static
的,因此你不应该从中调用实例方法。
你正在尝试这样做:
Session::newSession($key, $value);
而不是
$session = new Session();
$session->newSession($key, $value);
该错误不是因为您从公共方法中调用私有方法,而是因为您使用的是$this
而不是self
。
$this
特殊变量表示当前实例对象,而self
表示类本身。
如果启用错误显示并将错误报告级别设置为 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;
}
}
}
您可以在互联网上查找设计模式和单例,并使用魔术__clone()禁止多个实例
我只找到了文档的德语版本,我不知道为什么:http://de.php.net/manual/de/language.oop5.patterns.php
编辑:查看有关设计模式的链接:http://www.phptherightway.com/pages/Design-Patterns.html
请记住,static
方法都与class
绑定。非静态方法与实例绑定(当您执行类似 $instance = new MyClass();
的操作时)。但是,当您在静态上下文中调用某些内容时,您不必有任何实例。
当你想在实例($this
)上调用某些东西时,这是相同的,因为在静态上下文中不存在任何实例。
问题是public
方法static
,并且您正在尝试将方法用于实例化的对象。在静态方法中,$this
变量仅引用其他静态方法和属性。