簡體   English   中英

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;
}

}

我只希望__is_session_started函數由init()函數調用-因此它不必是靜態的或公共的-但我不確定如何引用它。

如果我將“ 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並且不需要對象實例,請使其成為staticstatic調用。

您必須將方法_is_session_started聲明為靜態。

private static function _is_session_started() {

然后用

self::_is_session_started();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM