header-bg.jpg
PHP面向对象之static(静态)关键字
发表于 2018-01-04 19:15
|
分类于 PHP
|
评论次数 0
|
阅读次数 1371

attachment/2018/01/04/10521515064289.jpg

一 相关介绍

static : 需要一个数据对象只服务于类,即类内部可用,对外不可用时。建对象是极其耗费资源的,因此当一个方法具有比较强的公用性时,没有必要为了调用这个方法而重新再生成该类的实例。定义的方法或变量在程序第一次加载即驻留内存,程序结束释放。(静态方法不能被非静态方法重写,构造方法不允许声明为staic

static变量:通过static声明的成员变量为静态变量或叫类变量,是该类的公共变量,在第一次使用时即生成,对于该类的所有对象只有一份,是属于类的,不是属于对象的。static变量是属于类而不属于对象,可以在任何地方通地类来访问,是类的全局变量,类创建时即存入内存。对多个对象来说,静态数据成员只存储一处,可以节省内存。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值。

static方法:用static声明的方法为静态方法或叫类方法,执行该方法时不会将对象引用传给函数,所以我们不能访问非静态成员,只能访问静态方法或静态变量。只能使用关于类的方式如self static parent等。使用时不生成对象即可执行

二 Example

###静态变量

?
1
2
3
4
5
6
7
function foo(){
    static $bar = 0;
    $bar++;
    echo $bar;
}
foo();  //output : 1
foo();  //output : 2
###静态属性
?
1
2
3
4
5
6
7
8
9
class foo{
    public static $bar = 0;
    public function foos(){
        self::$bar++;
        echo self::$bar;
    }
}
(new foo())->foos();    //output : 1
(new foo())->foos();    //output : 2

###静态属性拓展

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class db{
    public static $link = null;
  
    public function __construct(){
        if(is_null(self::$link)){
            self::$link = $this->connect();
        }
    }
  
    public function connect(){
        echo '连接一次,消耗一次资源';
        return true;
    }
}
new db();   //output : '连接一次,消耗一次资源'
new db();   //output : ''
new db();   //output : ''

###静态方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class foo{
    /*
     *静态调用无法触发构造方法
     */
    public function __construct(){
        echo '构造方法已执行';
    }
  
    /*
     *静态方法中不能使用$this 所以只能调用静态方法
     */
    public static function bar(){
        self::foos();
    }
  
    public static function foos(){
        echo '静态方法被调用了';
    }
  
    /*
     *非静态方法中可以调用静态方法
     */
    public function test(){
        echo '非静态方法被调用了';
        self::foos();
    }
}
foo::bar();    //output : '静态方法被调用了'
(new foo())->test();    //output : '构造方法已执行 非静态方法被调用了 静态方法被调用了'

发布评论
还没有评论,快来抢沙发吧!