PHP - 为什么我不能在公共方法中使用私有方法


PHP - Why can't I use private method inside public methods?

为什么我不能在我的"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时,它一定是可以访问的......

有可能,我

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

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

问题是你的newSessionstatic的,因此你不应该从中调用实例方法

我想

你正在尝试这样做:

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变量仅引用其他静态方法和属性。