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”方法被实例化为对象时,类中的其他方法正在使用该方法来设置私有变量的值,以减少对数据库的访问(如果已设置)。我知道这可能是构造函数的一部分,但我从来不需要在每个 php 脚本请求中多次实例化这个“Person”对象,该类主要用于将函数和变量组合在一起以进行组织.. .
Q2 - 将“data_all_get”变成静态方法有什么影响? 有吗?如果该方法是静态的,但它设置了私有 var $people_array 的值(它不是静态的),我认为如果需要在单个实例中第二次实例化该对象,则该 var 将能够被更新或覆盖脚本请求,对吗?另外,由于该属性不是静态的,因此该类的其他方法可以访问它。
Q3 - 我可以在不“破坏任何东西”的情况下多次调用静态方法“data_all_get”(加载的问题 IK)。
Q4 - 每次调用静态方法时是否只是使用额外的内存?
谢谢