PHP 从静态方法调用非静态方法


php calling a non static method from a static method

我已经在Java中读过一些关于这个问题的问题,但我在PHP中找不到我要找的东西 - 尽管这些非常接近: PHP 静态方法问题
在 PHP 中使用静态调用方法非静态

是否可以从静态中调用非静态方法?

我有一个会话类如下(由session::init()调用),但我无法弄清楚如何避免收到错误消息。

<?php 
class session {
    public static function init(){
    if (**QUERY HERE**_is_session_started() === FALSE ) {
//      if (session_status() == PHP_SESSION_NONE) {
            @session_start();   
        }   else {
            echo "Session already started<br/>";
        }
    }   

private function _is_session_started() {
    if ( php_sapi_name() !== 'cli' ) {
        if ( version_compare(phpversion(), '5.4.0', '>=') ) {
            return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
        } else {
            return session_id() === '' ? FALSE : TRUE;
        }
    }
    return FALSE;
}
}

我只希望 init() 函数调用 _is_session_started 函数 - 所以它不需要是静态或公共的 - 但我不确定如何引用它。

如果我将 QUERY HERE 替换为"self::",页面将加载,但出现此错误:

 PHP Strict Standards:  Non-static method session::_is_session_started() should not be called statically in /Applications/MAMP/htdocs/mvc/libs/session.php on line 5

但是,如果我尝试使用 $this->_is_session_started() 非静态引用该方法,则会出现致命错误,因为静态 init() 函数尚未实例化会话类。

所以我认为一定有另一种方法可以做到这一点。我可以使_is_session_started方法静态,或者只是让我的 init 函数更长,但我渴望理解为什么会这样。

谢谢

想要从静态方法调用非静态方法没有任何意义。若要调用非静态方法,需要一个对象实例。静态调用方法时,没有对象实例。我希望差异是显而易见的。

非静态方法的要点是它们可以访问特定于实例的数据:

class Foo {
    public $bar;
    public function baz() {
        echo $this->bar;
    }
}
$a = new Foo;
$b = new Foo;
$a->bar = 'Hello';
$b->bar = 'World';
$a->baz();
$b->baz();

$this关键词是这里的特殊酱汁。由于静态方法中没有对象实例,即没有$this,因此不能调用非静态方法:

Foo::baz();  // now what?

如果您的函数使用 $this 并且需要一个对象实例,则无法静态调用它。如果您的函数不使用$this并且不需要对象实例,请使其static并静态调用它。

您必须将方法_is_session_started声明为静态。

private static function _is_session_started() {

然后用

self::_is_session_started();