static 有什么作用?
点击:发布日期:2024/12/20
static 关键字主要有两种作用:*,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。第二,实现某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性。具体而言,static在PHP
语言中主要用来修饰成员变量和成员方法。
1.static 成员变量
PHP 语言中可以通过 static 关键字来达到全局的效果。PHP 类提供了两种类型的变量:用 static 关键字修饰的静态变量和没有 static 关键字的实例变量。静态变量属于类,在内存中只有一个拷贝(所有实例都共享静态变量),只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用了。静态变量可以通过“类名::静态属性名”进行访问。实例变量属于对象,只有对象被创建后,实例变量才会被分配空间,才能被使用,它在内存中存在多个拷贝。只能用“对象->实例变量”的方式来引用。以下是静态变量的使用
例子:
面试笔试经验技巧篇
XLVII
class Compute {
public static $pi = 3.14;
}
$r = 3;
echo Compute::$pi * $r * $r."\n";
Compute::$pi = 3.141;
echo Compute::$pi * $r * $r;
?>
程序的运行结果为
28.26
28.269
从上例可以看出,静态变量是属于类的,不依赖于对象而存在,可以在没有实例化对象的时候使用。
2.static 成员方法
与变量类似,PHP 类同时也提供了 static 方法与非 static 方法。static 方法是类的方法,不需要创建对象就可以被调用,而非 static 方法是对象的方法,只有对象被创建出来后才可以被使用。使用的方式是“类名::静态方法名”。static 方法不能调用非 static 方法,只能访问所属类的静态成员变量和成员方法,因为当static 方法被调用的时候,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法。同理,static 方法也不能访问非 static 类型的变量。static 一个很重要的用途是实现单例模式。单例模式的特点是该类只能有一个实例,为了实现这个要求,必须隐藏类的构造函数,即把构造函数声明为 private,并提供一个创建对象的方法,由于构造对象被声明为 private,外界无法直接创建这个类型的对象,只能通过该类提供的方法来获取类的对象,要达到这样的目的只能把创建对象的方法声明为 static。程序示
例如下:
class Singleton{
private static $_instance; // 保存类实例的静态成员变量
private function __construct(){ //构造函数
echo 'This is a Constructed method;';
}
public function __clone() { // 创建__clone 方法防止对象被复制克隆
echo "not allow clone"."\n";
}
// 判定是否已经有对象
public static function getInstance() {
if (! (self::$_instance instanceof self)) {
self::$_instance = new self ();
}
return self::$_instance;
}
public function test() {
面试笔试经验技巧篇
XLVIII
echo 'success';
}
}
?>
用 public 修饰的 static 变量和方法本质上都是全局的,如果在 static 变量前用 private 修饰,则表示这个变量可以在类的静态代码块或者类的其他静态成员方法中使用,但是不能在其他类中通过类名来直接引用。
语言中主要用来修饰成员变量和成员方法。
1.static 成员变量
PHP 语言中可以通过 static 关键字来达到全局的效果。PHP 类提供了两种类型的变量:用 static 关键字修饰的静态变量和没有 static 关键字的实例变量。静态变量属于类,在内存中只有一个拷贝(所有实例都共享静态变量),只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用了。静态变量可以通过“类名::静态属性名”进行访问。实例变量属于对象,只有对象被创建后,实例变量才会被分配空间,才能被使用,它在内存中存在多个拷贝。只能用“对象->实例变量”的方式来引用。以下是静态变量的使用
例子:
面试笔试经验技巧篇
XLVII
class Compute {
public static $pi = 3.14;
}
$r = 3;
echo Compute::$pi * $r * $r."\n";
Compute::$pi = 3.141;
echo Compute::$pi * $r * $r;
?>
程序的运行结果为
28.26
28.269
从上例可以看出,静态变量是属于类的,不依赖于对象而存在,可以在没有实例化对象的时候使用。
2.static 成员方法
与变量类似,PHP 类同时也提供了 static 方法与非 static 方法。static 方法是类的方法,不需要创建对象就可以被调用,而非 static 方法是对象的方法,只有对象被创建出来后才可以被使用。使用的方式是“类名::静态方法名”。static 方法不能调用非 static 方法,只能访问所属类的静态成员变量和成员方法,因为当static 方法被调用的时候,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法。同理,static 方法也不能访问非 static 类型的变量。static 一个很重要的用途是实现单例模式。单例模式的特点是该类只能有一个实例,为了实现这个要求,必须隐藏类的构造函数,即把构造函数声明为 private,并提供一个创建对象的方法,由于构造对象被声明为 private,外界无法直接创建这个类型的对象,只能通过该类提供的方法来获取类的对象,要达到这样的目的只能把创建对象的方法声明为 static。程序示
例如下:
class Singleton{
private static $_instance; // 保存类实例的静态成员变量
private function __construct(){ //构造函数
echo 'This is a Constructed method;';
}
public function __clone() { // 创建__clone 方法防止对象被复制克隆
echo "not allow clone"."\n";
}
// 判定是否已经有对象
public static function getInstance() {
if (! (self::$_instance instanceof self)) {
self::$_instance = new self ();
}
return self::$_instance;
}
public function test() {
面试笔试经验技巧篇
XLVIII
echo 'success';
}
}
?>
用 public 修饰的 static 变量和方法本质上都是全局的,如果在 static 变量前用 private 修饰,则表示这个变量可以在类的静态代码块或者类的其他静态成员方法中使用,但是不能在其他类中通过类名来直接引用。