[英]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
並且不需要對象實例,請使其成為static
並static
調用。
您必須將方法_is_session_started
聲明為靜態。
private static function _is_session_started() {
然后用
self::_is_session_started();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.