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

PHP支持类和面向对象结构,PHP的类的静态函数和变量不与任何特定类的实例相关联。请看:类与对象的区别。

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

相反,静态函数和变量与类定义本身相关联。换言之,一个类的所有实例都共享相同的静态变量。在一个类的方法的上下文中,静态变量和函数被访问使用self::,在一个类的对象的上下文中使用其他方法和变量时用this。

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

比较表

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

self

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

this

Example #1 静态成员代码示例

能在静态函数里使用是否可访问的类变量和方法由self::$this- (注意:PHP 5.3
允许由 $this 使用静态变量,用 $this::$foo。 $this-foo
将仍然没有被定义,如果 $foo 是一个静态变量.)需要一个实例对象否是

 代码如下

PHP中self和this的实例

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

class exampleClass{ public static $foo; public $bar; public function
regularFunction() { echo $this-bar; } public static function
staticFunction() { echo self::$foo; } public static function
anotherStatFn() { self::staticFunction(); } public function
regularFnUsingStaticVar() { echo self::$foo; } // 注: PHP 5.3使用
$this::$bar代替 self::$bar 是允许的}exampleClass::$foo = Hello;$obj =
new exampleClass();$obj-bar = World!;exampleClass::staticFunction(); /*
打印 Hello */$obj-regularFunction(); /* 打印 World! */

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

静态函数只能使用静态变量,静态函数和变量的引用是通过 self::函数名() 和
self::变量名。上述实例中,静态变量的引用是由类名(exampleClass::$foo),或者self::(self::$foo),当在这个类的静态方法[称为
静态函数()]里使用时。类的正则函数和变量需要一个对象上下文来引用,他们不能脱离对象上下文而存在。对象上下文由$this提供。在上述函数中,$bar
是一个正则变量,所以它被 $obj-bar(上下文使用变量obj) 来引用,或者使用
$this-bar(再次在一个对象的方法里在一个对象上下文中) 来引用。

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

self 不使用前面的 $,因为 self 不意味着是一个变量而是类结构本身。而
$this 引用一个特定的变量,所以有前面的 $ 。

print Foo::$my_static . ” “;

参考:静态关键词

$foo = new Foo();
print $foo->staticValue() . ” “;
print $foo->my_澳门新葡亰3522平台游戏,static . ” “;      // Undefined “Property” my_static

声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问。

print $foo::$my_static . ” “;
$classname = ‘Foo’;
print $classname::$my_static . ” “; // PHP 5.3.0之后可以动态调用

为了兼容 PHP 4,如果没有指定访问控制,属性和方法默认为公有。

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

由于静态方法不需要通过对象即可调用,所以伪变量 $this
在静态方法中不可用。

 Example #2 静态方法代码示例

静态属性不可以由对象通过-操作符来访问。

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

用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。

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

就像其它所有的 PHP
静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。

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

自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字
self,parent 或 static。

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

静态关键词实例

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

?phpclass 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 . n;$foo = new Foo();print $foo-staticValue() .
n;print $foo-my_static . n; // Undefined Property my_staticprint
$foo::$my_static . n;$classname = Foo;print $classname::$my_static .
n; // As of PHP 5.3.0print Bar::$my_static . n;$bar = new
Bar();print $bar-fooStatic() . n;? /programlisting /example example
title静态方法示例/title programlisting role=php![CDATA[?phpclass Foo {
public static function aStaticMethod() { // …
}}Foo::aStaticMethod();$classname = Foo;$classname::aStaticMethod(); //
自 PHP 5.3.0 起?

 代码如下

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关键字

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