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

时间:2013-11-13 16:48:55

标签: php oop

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

时,它必须是可访问的

有可能,我错过了一篇有用的文章,应该对我有所帮助,但最后我终于要求了。

那么为什么这不起作用?

5 个答案:

答案 0 :(得分:6)

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

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