php 5.3+
很抱歉这个问题很长,但我想完全了解这一点。
我知道我不能从静态方法中调用非静态相同类方法,而不将类实例化为对象。
class Person
{
private $people_array;
function data_all_get()
{ // touch database, return array of people
$this->people_array = // etc dbquery results
}
static function showPeople()
{ // call class method
$people_data = $this->data_all_get();
// Fatal error: Using $this when not in object context
}
} // end class Person
从搜索SO,我发现了一些有趣的方法,但想知道每种方法如何影响代码环境。
我的问题如下:
我可以将类实例化为静态方法中的对象,以获得对非静态方法的访问
static function showPeople()
{ // instantiate as object
$person = New Person();
// call class method
$people_data = $this->data_all_get();
}
Q1 - 这会导致什么问题? 在我的情况下,该类没有构造函数,因此该实例不会影响其他类方法或变量。在脚本执行期间,这个新对象会占用内存中的一小块空间吗?似乎不太糟糕......
另一种选择是将“data_all_get”方法转换为静态方法,因此可以从静态方法“showPeople”中调用它,即
self::showPeople()
当实例化为对象时,类中的其他方法正在使用“data_all_get”方法,以设置私有var的值,以减少到数据库的行程(如果已经设置)。我知道这可能是构造函数的一部分,但我从来不需要每个php脚本请求多次实例化这个“Person”对象,该类主要用于将函数和变量组合在一起进行组织。 。
Q2 - 将“data_all_get”变成静态方法有什么意义? 有没有?如果方法是静态的,但是它设置私有var $ people_array的值(它不是静态的),我认为如果对象需要在单个中第二次实例化,那么var将能够被更新或覆盖脚本请求,对吗?此外,由于该属性不是静态的,因此该类的其他方法可以访问它。
Q3 - 我可以根据需要多次调用静态方法“data_all_get”而不“破坏任何东西”(加载的问题IK)。
Q4 - 每次调用静态方法时,它是否只是使用额外的内存?
谢谢