我已经在Java中阅读了一些关于此的问题,但我无法在PHP中找到我想要的内容 - 尽管这些内容非常接近:
php static methods question
Call method non-static with static in 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 替换为&#39; self ::&#39;页面加载,但我收到此错误:
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-&gt; _is_session_started()非静态地引用该方法,那么我会收到致命错误,因为静态init()函数没有实例化会话类。
所以我认为必须有另一种方法来做到这一点。我可以将_is_session_started方法设为静态,或者只是让我的init函数更长,但我很想知道为什么会这样。
由于
答案 0 :(得分:3)
想要从静态方法调用非静态方法没有任何意义。要调用非静态方法,需要对象实例。静态调用方法时,没有对象实例。我希望这种差异很明显。
非静态方法的关键是他们可以访问特定于实例的数据:
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
并静态调用它。
答案 1 :(得分:0)
您必须将方法_is_session_started
声明为静态。
private static function _is_session_started() {
然后用
调用它self::_is_session_started();