您的位置:首页 > 编程语言 > PHP开发

php面向对象中static及单态模式

2012-02-16 18:08 323 查看




之前我们有分析过final这个关键字,我们都知道它可以修饰类和成员方法但是不能修饰成员属性。那么static呢?它可以修饰成员属性和成员方法但是不能修饰类。

讨论static,我们应该从下面几个方面入手:
(1) static表示的是什么
(2) static如何使用
(3) static修饰的成员属性和方法在内存中如何表示
(4) static有哪些特点
(5) 需要注意的一些问题
(6) 应用:单态模式
Ok,开始吧:
Static是用来修饰对象中的成员属性和成员方法的,简单点就是用来修饰数据的,它说明数据是静态的。只要我们说明这些数据是静态之后,我们就能够在所有实例化的对象中使用这同一数据,而不用每实例化一个对象就设置一次。这样既省空间又方便。
在类外,不用实例化对象也可以使用,格式是“类名::成员”(在public情况下);在类中使用是“self::成员”。举例说明:
Class a{
Public static $a=123;
Public say(){
echo self::$a;
}
}
echo a::$a;

学过c++的童鞋们都知道逻辑上内存划分用四个地方来存储数据:栈空间段,堆空间段,初始化数据段和代码段。程序中不同声明的数据类型将会存储在不同的内存段中。这个有必要说明一下:
1、 栈空间段:栈空间是很小的,但是cpu的访问速度快,由于其“先进后出”的特点,很方便保存、恢复和调用现场。一般用于存储临时变量,如布尔型的,double型的数据。
2、 堆空间段:这个是很具有弹性的东西,他的空间大小并不是固定的,可以动态的伸张和缩减,用于存储比较大和长度不定的数据,特点是“先进先出”。可以存储的数据,例如字符串,数组,对象等。
3、 数据段:用于存放静态分配的变量,供全局使用。Static所修饰的成员就是放在这里的哦
4、 代码段:用于存储可执可执行的操作指令,例如函数。

关于对象的实例化以及对象的引用原理和c++中一样,具体可以看看c++中的指针对象这一节,这里不做详解。
Static修饰的成员有这些特点:可以被同一个类的所有对象使用,只要改变了其值,所有对象的static修饰的成员的值同时改变,记住这个是个对象“共用体”即可。静态的数据是在每一次类加载的时候放到内存中去的,以后用到类时直接从内存中取。这里所说的类加载是指只要在程序中使用这个类(出现这个类名)。

注意两点:
(1) 所有静态成员都用类名去访问不用创建对象,不用对象去访问。
(2) 注意在非静态成员中可以访问静态成员,但是在静态成员中不能使用非静态成员。
原因很简单:因为你都不用创建对象就可以访问,那么this表示的是什么,所以肯定是不行的 。
例如:
Class a{
Public Static say(){
$this->sayto();
}
Protected sayto(){
echo “哈哈,我说话了”:
}
}
A::Say(); //这样是错的,因为this表示的是对象,而你根本就没有创建对象。

应用单态模式:
单态模式是指保证一个类只能创建一个对象。这样就可以避免创建过多的不必要的对象而浪费资源的消耗,例如数据库操作类就可以使用单态模式。因为连接数据库不必创建多个对象。
那么如何实现单态模式呢?
其实就是不让他直接创建对象,不能实例化对象,这样就得把构造函数用private 修饰 。
但是还得实例化一个对象啊,怎么办?不用怕,虽然,private在外部不能访问,但是在内部可以访问啊,只要我们通过内部的一些方法去访问的时候,new一个对象就可以了。
但是,其他的成员方法,你没有实例化对象,也不能直接访问啊?,怎么办,别忘了,还有我们的static,这个小东西所修饰的成员是不用创建对象就可以访问的啊,这样子,我们就可以只产生一个对象了华夏名网主机怎么样
虽然我们的static无法访问非静态的成员,但是new 一个对象,就相当于访问了构造函数,这样就把对象实例化了,最后还要防止复制对象实例,保证只有一个。
例子:
[align=left]<?php[/align]
[align=left]class Example[/align]
[align=left]{[/align]
[align=left] // 保存类实例在此属性中[/align]
[align=left] private static $instance;[/align]
[align=left] [/align]
[align=left] // 构造方法声明为private,防止直接创建对象[/align]
[align=left] private function __construct() [/align]
[align=left] {[/align]
[align=left] echo 'I am constructed';[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] // singleton 方法[/align]
[align=left] public static function singleton() [/align]
[align=left] {[/align]
[align=left] if (!isset(self::$instance)) {[/align]
[align=left] $c = __CLASS__;[/align]
[align=left] self::$instance = new $c;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] return self::$instance;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] // Example类中的普通方法[/align]
[align=left] public function bark()[/align]
[align=left] {[/align]
[align=left] echo 'Woof!';[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] // 阻止用户复制对象实例[/align]
[align=left] public function __clone()[/align]
[align=left] {[/align]
[align=left] trigger_error('Clone is not allowed.', E_USER_ERROR);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left] [/align]
?>本文出自 “网络人生博客” 博客,谢绝转载!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: