php中关键字static 和关键字public 有什么不同,php中static关键字对变量和函数影响...

在php中static是一个静态变量,他可以定义函数,变量为全局静态变量了,那么我们在函数或变量前面加上static会对函数与变量产生怎么样的影响呢,下面我们一起来看看。

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

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

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

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

Example #1 静态成员代码示例

 代码如下复制代码

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 静态方法代码示例

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
";

}

public  function callrun() {

return self::run();//用self::方式调用一个非静态方法

}

}

echo Foo::$my_static . "
";

echo Foo::run();//用className::方法名调用非静态方法

echo Foo::callrun();

面试题之static关键字

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

 代码如下复制代码

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函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值