PHP基础知识系列:静态
2012-09-08 15:43
1376 查看
静态变量:
只存在于函数作用域的变量,在函数执行完成后,这种变量的值不会丢失。下一次调用这个函数时,这个变量仍然会记住原来的值。如:
静态成员:
是一种类变量,可以把它看成是属于整个类而不是属于类的实例。所有的实例成员都共享这个成员。
这里使用的是self::作用域限定符,而不用$this。因为self::表示类,而$this表示的是实例。
::这个操作符,左边表示的是作用域,右边表示的是访问成员。可以使用系统定义的作用域:self和parent。
self::可以调用基类中声明的方法,但是它调用的总是已经在扩展中重写的方法。如下:
静态方法不在需要实例化类。
static成员能够限制外部的访问,因为static的成员是属于类的,是不属于任何对象实例,是在类第一次被加载的时候分配的空间,其他类是无法访问的,只对类的实例共享,能一定程度对类该成员形成保护;
从内存的角度我们来分析一下,内存从逻辑上被分为四段,其中对象是放在“堆内存”里面,对象的引用被放到了“栈内存“里,而静态成员则放到了“初始化静态段”,在类第一次被加载的时候放入的,可以让堆内存里面的每个对象所共享,如下图:
代码
<?php
class MyClass
{
//定义一个常量constant
const constant = 'constant value';
function showConstant() {
echo self::constant . "\n"; //使用self访问,不要加”$”
}
}
echo MyClass::constant . "\n"; //使用类名来访问,也不加”$”
$class = new MyClass();
$class->showConstant();
// echo $class::constant; 是不允许的
?>
只存在于函数作用域的变量,在函数执行完成后,这种变量的值不会丢失。下一次调用这个函数时,这个变量仍然会记住原来的值。如:
function testing(){ static $a = 1; $a *= 2; echo $a . "\n"; } testing();//2 testing();//4 testing();//8
静态成员:
是一种类变量,可以把它看成是属于整个类而不是属于类的实例。所有的实例成员都共享这个成员。
class MyObject{ public static $myStaticVar = 0; function myMethod(){ self::myStaticVar += 2; echo self::myStaticVar . "\n"; } } $instance1 = new MyObject(); $instance1->myMethod();//2 $instance2 = new MyObject(); $instance2->myMethod();//4
这里使用的是self::作用域限定符,而不用$this。因为self::表示类,而$this表示的是实例。
::这个操作符,左边表示的是作用域,右边表示的是访问成员。可以使用系统定义的作用域:self和parent。
self::可以调用基类中声明的方法,但是它调用的总是已经在扩展中重写的方法。如下:
class MyObject { public static $myVar = 0; function myMethod() { self::$myVar+=2; echo self::$myVar . "/n"; } } class MyOtherObject extends MyObject { function myMethod() { echo "基类myMethod被重写"; } static function myOtherMethod() { echo "myExtendsedMethod" . "/n"; self::myMethod(); //在扩展类中使用self作用域时,self可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法. parent::myMethod();//如果基类的方法被重写的情况下,你希望调用定义在基类的方法,可以使用parent作用域. parent::myMethod();//静态成员 } } MyOtherObject::myOtherMethod();
静态方法不在需要实例化类。
static成员能够限制外部的访问,因为static的成员是属于类的,是不属于任何对象实例,是在类第一次被加载的时候分配的空间,其他类是无法访问的,只对类的实例共享,能一定程度对类该成员形成保护;
从内存的角度我们来分析一下,内存从逻辑上被分为四段,其中对象是放在“堆内存”里面,对象的引用被放到了“栈内存“里,而静态成员则放到了“初始化静态段”,在类第一次被加载的时候放入的,可以让堆内存里面的每个对象所共享,如下图:
代码
<?php
class MyClass
{
//定义一个常量constant
const constant = 'constant value';
function showConstant() {
echo self::constant . "\n"; //使用self访问,不要加”$”
}
}
echo MyClass::constant . "\n"; //使用类名来访问,也不加”$”
$class = new MyClass();
$class->showConstant();
// echo $class::constant; 是不允许的
?>
相关文章推荐
- PHP基础知识系列:错误处理与异常处理
- PHP基础知识系列:异常
- PHP基础知识系列:预定义变量
- PHP基础知识系列:abstract 抽象类
- PHP基础知识系列:PHP5新特征
- PHP基础知识系列:interface 接口
- PHP基础知识系列:面向对象基础
- [C#基础知识系列]全面解析C#中静态与非静态
- PHP基础知识总结系列文章归档
- [C#基础知识系列]全面解析C#中静态与非静态
- PHP基础知识系列:cookie与session
- 《php开发典型模块大全》读书笔记 第二章 基础知识 (张迅雷闪击PHP系列)
- PHP基础知识系列:知识点
- 【转】PHP基础知识系列:heredoc
- 《PHP基础知识总结》系列-新鸟老鸟通吃
- PHP基础知识系列:多态性
- PHP基础知识系列:require与include的区别
- PHP基础知识系列:拦截器方法
- PHP基础知识系列:对象串行化serialize与unserialize
- [C#基础知识系列]全面解析C#中静态与非静态