视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
php中static关键字的理解
2020-11-03 23:10:28 责编:小采
文档

函数内的static变量

static静态变量的理解

静态变量 类型说明符是static。

静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直 到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。

另外,属于静态存储方式的量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。

所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。

静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。

静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。

函数内静态变量

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%

从上面的例子可以看出,static关键字影响了引用传递,即使我们使用了&来试图改变变量$cache的值和地址,仍然不影响doStuff()函数中的if判断;

而且,在doStuff()函数中,静态变量$cache并不是不可改变的,$cache从null变成了%heavy database stuff or something%;

类中的静态方法和属性

● 我们把类当成生成对象的模板,把对象作为活动组件,实例化一个类,得到一个对象,然后访问这个对象的方法和属性。

例如 $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
非延迟静态绑定
延迟静态绑定

使用self关键字,指是当前类(A),因此获取的也就是类A的aa()方法的返回值;

php5.3之后,我们可以使用static来获取子类的aa()方法,它指的的被调用的类。

总结:

static关键字的延迟绑定有很多用途,一般在项目中可边做边总结。

下载本文
显示全文
专题