php中static关键字对变量和函数影响

 
1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

2) 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。  

3) static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

PHP5.3.0之后,我们可以用一个变量来动态调用类。但该变量的值不能为关键字self, parent 或static。

Example #1 静态成员代码示例

 代码如下 复制代码

<?php
class Foo
{
    public static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;
    }
}

class Bar extends Foo
{
    public function fooStatic() {
        return parent::$my_static;
    }
}

print Foo::$my_static . " ";

$foo = new Foo();
print $foo->staticValue() . " ";
print $foo->my_static . " ";      // Undefined "Property" my_static

print $foo::$my_static . " ";
$classname = 'Foo';
print $classname::$my_static . " "; // PHP 5.3.0之后可以动态调用

print Bar::$my_static . " ";
$bar = new Bar();
print $bar->fooStatic() . " ";
?>

 Example #2 静态方法代码示例

<?php
class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // As of PHP 5.3.0
?>

关于Static关键字在类中的使用,PHP手册给出了如下的约定:

1、声明类成员或方法为static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)。

2、由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。
3、静态属性不可以由对象通过->操作符来访问。
4、用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。
现在来关注一下第4条约定。
运行环境: (Win32) PHP/5.3.3

 代码如下 复制代码

class Foo{ 
    
    public static $my_static = 'foo';//声明一个静态成员 
    
    
    public function staticValue() {//静态方法 
        return self::$my_static;// 
    } 
    public function run(){//非静态方法 
      return "abc <br>"; 
    } 
    public  function callrun() { 
        return self::run();//用self::方式调用一个非静态方法 
            
    } 
     

    
echo Foo::$my_static . "<br >"; 
    
echo Foo::run();//用className::方法名调用非静态方法 
echo Foo::callrun();

面试题之static关键字

题目代码:写出以下代码的运算结果( )

 代码如下 复制代码

<?php

function dewen(){
  $k=add_number(100);
  $k+=add_number(100);
  printf("%d",$k);
  return 0;
 }

 function add_number($n){
  static $i=100;
  $i+=$n;
  return $i;
 }

第一眼以为就是简单地自加计算:以为结果是400,结果答案错误。最后仔细看了下,敲了一边代码,运行才知道是500。打印了两次$i+=$n;计算之前的$i,一次是100,一次是200;知道问题是static在做鬼。然后百度了一下static关键字,才恍然大悟。

static关键字作用:

PHP中static变量的使用范围要更广一些,我们不仅可以在类,方法或变量前面添加 static修饰符,我们甚至还能给函数内部变量添加static关键字。添加了static修饰符的变量即使在该函数执行完毕值仍然不会丢失,也就是说,在下一次调用这个函数时,变量仍然记得原来的值。如:

 代码如下 复制代码

01  <?php 

02  function test() 

03  { 

04       static $var1 =1; 

05       $var1 +=2; 

06       echo $var1 . ' ' ; 

07  } 

08   

09  test(); 

10  test(); 

11  test(); 

12  ?> 
运行结果如下:

3 5 7

综上所述:

static全局变量与普通的全局变量有什么区别:
static全局变量只初使化一次,防止在其他文件单元中被引用;   
static局部变量和普通局部变量有什么区别:
static局部变量只被初始化一次,下一次依据上一次结果值;   
static函数与普通函数有什么区别:
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

时间: 2024-10-25 12:13:09

php中static关键字对变量和函数影响的相关文章

PHP中static关键字以及与self关键字的区别

  这篇文章主要介绍了PHP中static关键字以及与self关键字的区别,本文讲解了static关键字的定义.迟绑定(Late Static Bindings).以及与self关键字的区别等内容,需要的朋友可以参考下 概述 正在学习设计模式,之前有一篇文章关于单例模式的文章,重新读了这篇文章,发现对static关键字掌握不是很牢靠,重新温习一下. static关键字 PHP手册里对static关键字的介绍如下: 代码如下: Declaring class properties or metho

Java中static关键字的作用和用法详细介绍_java

static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是

java类的static修饰的变量,函数属于哪种内存?

问题描述 java类的static修饰的变量,函数属于哪种内存?是栈内存还是堆内存?请给个讲解链接,谢谢 解决方案 http://wenku.baidu.com/view/8775d826482fb4daa58d4b31.html

关于C/C++中static关键字的作用总结_C 语言

1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.举例来说明.同时编译两个源文件,一个是a.c,另一个是main.c. 复制代码 代码如下: //a.cchar a = 'A';               // global variablevoid msg(){     printf("Hello\n");} 复制代码 代码如下: //main.c int main

PHP中static关键字以及与self关键字的区别_php实例

概述 正在学习设计模式,之前有一篇文章关于单例模式的文章,重新读了这篇文章,发现对static关键字掌握不是很牢靠,重新温习一下. static关键字 PHP手册里对static关键字的介绍如下: 复制代码 代码如下: Declaring class properties or methods as static makes them accessible without needing an instantiation of the class. A property declared as

C++的static关键字及变量存储位置总结_C 语言

今天看博文时,看到了c++的static关键字的一些总结,还涉及到了一些代码的存储位置,为了有时间的时候能够看一下,还是自己把它给摘抄下来吧. C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 一.面向过程设计中的static 1.静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量.我们先举一个静态全局变量的例子,如下: 复制代码 代码

详解Java编程中static关键字和final关键字的使用_java

Java static关键字以及Java静态变量和静态方法 static 修饰符能够与变量.方法一起使用,表示是"静态"的. 静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的成员又称作类变量和类方法.静态变量与实例变量不同,实例变量总是通过对象来访问,因为它们的值在对象和对象之间有所不同. 请看下面的例子: public class Demo { static int i = 10; int j; Demo() { this.j

PHP中static关键字原理的学习研究分析_php技巧

看PHP手册的时候发现了下面这样一段代码: 复制代码 代码如下: <?php function Test() { static $count = 0; $count++; echo $count; if ($count < 10) { Test(); } $count--; } ?> 执行结果如下: 这是一个递归的函数,声明的静态变量count记录次数,输出1~10. 我在看的时候有个疑惑,递归调用的时候 static $count = 0; 语句会重复执行,这为什么不会导致count变

php Static关键字静态变量的实用方法(1/3)

 代码如下 复制代码 <?php class Foo { public static $my_static = 'foo'; public function staticValue() { return self::$my_static; } } class Bar extends Foo { public function fooStatic() { return parent::$my_static; } } print Foo::$my_static . " "; $foo