php 从静态方法调用非静态方法
php calling a non static method from a static method
我在 Java 中阅读了一些关于此的问题,但我无法在 PHP 中找到我正在寻找的内容 - 尽管这些问题非常接近:
php static methods question
Call method non-static with static in PHP
是否可以从静态方法中调用非静态方法?
我有一个会话 class 如下(由 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 函数 - 因此它不需要是静态的或 public - 但我不确定如何参考一下。
如果我将 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() 函数尚未实例化会话 class.
所以我想一定有另一种方法可以做到这一点。我可以使 _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();
我在 Java 中阅读了一些关于此的问题,但我无法在 PHP 中找到我正在寻找的内容 - 尽管这些问题非常接近:
php static methods question
Call method non-static with static in PHP
是否可以从静态方法中调用非静态方法?
我有一个会话 class 如下(由 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 函数 - 因此它不需要是静态的或 public - 但我不确定如何参考一下。
如果我将 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() 函数尚未实例化会话 class.
所以我想一定有另一种方法可以做到这一点。我可以使 _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();