函数内的static变量php
static静态变量的理解html
静态变量 类型说明符是static。web
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也能够认为是其内存地址不变,直 到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执行过程当中始终存在,可是在它做用域以外不能使用。函数
另外,属于静态存储方式的量不必定就是静态变量。 例如:外部变量虽属于静态存储方式,但不必定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。spa
全部的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。3d
静态变量能够在任何能够申请的地方申请,一旦申请成功后,它将再也不接受其余的一样申请。code
静态变量并非说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,并且它会保持最新的值。说其静态,是由于它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,若是咱们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。htm
函数内静态变量对象
static usage内存
1,请看下面这个例子:
function
doStuff(&
$cache
) {
static
$cache
= null;
if
(
$cache
=== null) {
echo
$cache
=
'%heavy database stuff or something%'
;
}
}
$cache
=
'not null'
;
doStuff(
$cache
);
// Output
%heavy database stuff
or
something%
并且,在doStuff()函数中,静态变量$cache并非不可改变的,$cache从null变成了%heavy database stuff or something%;从上面的例子能够看出,static关键字影响了引用传递,即便咱们使用了&来试图改变变量$cache的值和地址,仍然不影响doStuff()函数中的if判断;
类中的静态方法和属性
● 咱们把类当成生成对象的模板,把对象做为活动组件,实例化一个类,获得一个对象,而后访问这个对象的方法和属性。
例如 $foo = new Foo(); $foo就是类Foo实例化后的对象。
● 静态方法是以类做为做用域的函数,咱们能够不经实例化,直接访问静态方法.
例如:
class
Foo()
{
public
static
function
a(){}
}
// 访问a();
Foo::a();
● 在当前类(非子类)中访问静态方法或属性使用self::method(),note: self能够调用父类的静态方法和属性;● 静态方法不能访问这个类中的普通属性和方法,由于那些属性和方法属于一个对象,而静态方法和属性又称为类变量的方法。
延迟静态绑定
先看个例子
header(
"Content-type: text/html; charset=utf-8"
);
class
A
{
public
static
function
aa()
{
echo
"非延迟静态绑定<br>"
;
}
public
static
function
bb()
{
echo
self::aa();
// Output 非延迟静态绑定
echo
static
::aa();
// Output 延迟静态绑定
}
}
class
B
extends
A
{
public
static
function
aa()
{
echo
"延迟静态绑定"
;
}
public
static
function
cc()
{
echo
self::bb();
}
}
B::bb();
// Output
非延迟静态绑定
延迟静态绑定
php5.3以后,咱们可使用static来获取子类的aa()方法,它指的的被调用的类。使用self关键字,指是当前类(A),所以获取的也就是类A的aa()方法的返回值;
总结:
static关键字的延迟绑定有不少用途,通常在项目中可边作边总结。