[英]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.