0

为什么我无法访问“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......

有可能我错过了一篇有用的文章,这应该对我有所帮助,但最后我还是问了。

那么为什么这不起作用呢?

4

5 回答 5

6

问题是您的newSessionis static,因此您不应该从中调用实例方法

于 2013-11-13T16:52:10.413 回答
2

我想你正在尝试做:

Session::newSession($key, $value);

代替

$session = new Session();
$session->newSession($key, $value);

该错误不是因为您从公共方法中调用私有方法,而是因为您使用$this的是self.

$this特殊变量代表当前实例对象,而self代表类本身。

于 2013-11-13T16:53:24.990 回答
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;
        }
    }
}

您可以在互联网上查找设计模式和单例,并使用魔术 __clone() 来禁止多个实例

我只找到了德语版本的文档,我不知道为什么:http ://de.php.net/manual/de/language.oop5.patterns.php

编辑:检查有关设计模式的链接:http ://www.phptherightway.com/pages/Design-Patterns.html

于 2013-11-13T17:10:05.613 回答
0

请记住,这些static方法与class. 非静态方法与实例绑定(当您执行类似的操作时$instance = new MyClass();)。但是当你在静态上下文中调用某些东西时,你不必有任何instance

当你想在 instance( $this) 上调用某些东西时也是一样的,因为在静态上下文中不存在任何instance

于 2013-11-13T17:17:12.717 回答
-1

问题是public方法是static并且您正在尝试对实例化对象使用方法。在静态方法中,$this变量仅引用其他静态方法和属性。

于 2013-11-13T16:52:03.473 回答