php中static关键字对变量和函数影响
发布:smiling 来源: PHP粉丝网 添加日期:2014-02-21 08:09:36 浏览: 评论:0
在php中static是一个静态变量,他可以定义函数,变量为全局静态变量了,那么我们在函数或变量前面加上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修饰符的变量即使在该函数执行完毕值仍然不会丢失,也就是说,在下一次调用这个函数时,变量仍然记得原来的值,实例代码如下:
- <?php
- function test()
- {
- static $var1 =1;
- $var1 +=2;
- echo $var1 . ' ' ;
- }
- test();
- test();
- test();
- ?>
运行结果如下:3 5 7
综上所述:
static全局变量与普通的全局变量有什么区别:
static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:
static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
Tags: static 关键字 变量
- 上一篇:php const常量修饰符使用方法
- 下一篇:php 浮点数精度值实例程序详解
相关文章
- ·php中final static $this关键字学习笔记(2014-03-07)
- ·PHP中::、->、self、$this操作符(2014-03-10)
- ·php中global static和$GLOBALS使用与区别(2014-03-13)
- ·php中global和static两个关键字详解(2014-07-30)
- ·php中static const define变量的区别(2015-04-08)
- ·PHP中new static()与new self()的区别异同分析(2021-04-08)
- ·PHP中new static() 和 new self() 的区别介绍(2021-05-08)
- ·php之static静态属性与静态方法实例分析(2021-06-15)
- ·PHP中的静态变量及static静态变量使用详解(2021-06-25)
- ·php实现文章内容关键字增加内链(2014-01-08)
- ·PHP 全局变量之Global关键字引用解读(2014-03-06)
- ·PHP中屏蔽过滤指定关键字实现方法总结(2014-08-22)
- ·PHP过滤黑名单关键字的例子(2014-09-22)
- ·PHP中的use关键字概述(2021-03-23)
- ·PHP屏蔽过滤指定关键字的方法(2021-04-21)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)