当初去盛大笔试的时最后有两道题目,一道题目是关于Static,一道是关于clone()方法;
Static表示的是静态关键字,可以修饰变量和方法;
静态变量(属性):
静态变量可以理解为“只有一个”,无论它所在的类创造多少个实例,它始终只有一个,在内存中只有一份,为所有的实例共用。
下面是例子:
<?php
class dome{
public static $var = 1;
public function myfun(){
echo "var is ".self::$var."!";
}
}
echo "var is ".dome::$var."!";
dome::$var = 2;
$obj = new dome();
$obj->myfun();
?>
运行结果如下:
可以看到,在未创建dome类的对象时,我们改变了静态熟悉var的值,创建dome类对象后var依然是最后改变它的数值。
如果不使用静态变量:
<?php
class dome{
public $var = 1;
public function read(){
echo $this->var."\n";
}
public function change(){
$this->var = 9;
}
}
$obj = new dome();
$obj->read();
$obj->change();
$obj->read();
$obj2 = new dome();
$obj2->read();
?>
我们可以看到:
每次创建一个新的对象,内存会重新分配新的地址和初始化的属性。
静态熟悉非静态熟悉还有一个不同:
<?php
class dome{
public static $var = 1;
}
echo dome::$var."\n";
?>
运行结果如下:
在类外可以直接用::调用,非静态不行(废话);并且静态熟悉不可以使用this来调用,原因就是静态熟悉不属于任何对象。静态属性不可以由对象通过 -> 操作符来访问。
静态方法:
我搜索了半天,网上大多数教程都这么说:
静态方法与非静态方法的重要区别是:静态方法不需要创建对象即可访问。
好吧,我亲自测试,发现非静态也可以调用:
并且非静态和静态方法都可以调用静态资源,但是有一点是可以肯定的,静态方法是无法调用非静态资源的,因为没有this的为对象可供调用。
但是如果使用::直接调用非静态方法,必须确保该方法内没有调用非静态熟悉(废话)。
静态关键字:
static 关键字,这里作为作用域引用。类似于parent, self等关键字。与parent和self不同的是,parent 引用的是父类作用域,self引用的是当前类的作用域,而static引用的是全部静态作用域,子类会覆盖父类,考虑下面的例子:
最后,本人的博客移至http://www.ebwill.com
原文:http://www.cnblogs.com/ebwill/p/5748803.html