最近一直在用static,之前的项目也看人家用过,但是具体为什么也说不清,一直都只用在function上,刚看到了一篇大神的文章,现做记录
释义:静态变量仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果。
我之前一直static function就是因为实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单,可是…请往下看
【事实上如果一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不应该把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。
当然你完全可以把所有的实例方法都写成静态的,将实例作为参数传入即可,一般情况下可能不会出什么问题。
从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象 反之使用静态方法。这只是从面向对象角度上来说的。
如果从线程安全、性能、兼容性上来看 也是选用实例化方法为宜】
既然说到这了,那就简单说一说静态方法和实例化的有所差异的地方吧
- static方法是类中的一个成员方法,属于整个类,即使不用创建任何对象也可以直接调用!
- 静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。
- 静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。
注意:
- 函数体中的静态变量与全局中的静态变量不冲突,只有在关键字global作用下才会使局部与全局统一
- 函数体中的静态变量在函数调用的时候只会被初始化一次
- 静态方法可以调用静态属性,禁止调用非静态属性
- 静态方法内不允许出现$this,出现就停掉脚本
- 在静态方法中调用类中其他静态方法有两种格式 self:: 和 static 。根据输出结果我们了解到两种方式的区别是 使用 self::method() 调用本方法所在类的 method() 方法。使用static::method(),会调用整个继承家族最后定义的方法
static用法如下:
1.static 放在函数内部修饰变量
2.static放在类里修饰属性,或方法
3.static放在类的方法里修饰变量
1.在函数执行完后,变量值仍然保存
如下所示:
<?php
function testStatic() {
static $val = 1;
echo $val;
$val++;
}
testStatic(); //output 1
testStatic(); //output 2
testStatic(); //output 3
?>
2.修饰属性或方法,可以通过类名访问,如果是修饰的是类的属性,保留值
如下所示:
<?php
class Person {
static $id = 0;
function __construct() {
self::$id++;
}
static function getId() {
return self::$id;
}
}
echo Person::$id; //output 0
echo "<br/>";
$p1=new Person();
$p2=new Person();
$p3=new Person();
echo Person::$id; //output 3
?>
3.修饰类的方法里面的变量
如下所示:
<?php
class Person {
static function tellAge() {
static $age = 0;
$age++;
echo "The age is: $age
";
}
}
echo Person::tellAge(); //output 'The age is: 1'
echo Person::tellAge(); //output 'The age is: 2'
echo Person::tellAge(); //output 'The age is: 3'
echo Person::tellAge(); //output 'The age is: 4'
?>