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

d96b3d607ea92e802829c6f6c595cbb8.png

之前我们有分析过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 一个对象,就相当于访问了构造函数,这样就把对象实例化了,最后还要防止复制对象实例,保证只有一个。

例子:

class Example

{

//保存类实例在此属性中

private static $instance;

//构造方法声明为private,防止直接创建对象

private function __construct()

{

echo 'I am constructed';

}

// singleton方法

public static function singleton()

{

if (!isset(self::$instance)) {

$c = __CLASS__;

self::$instance = new $c;

}

return self::$instance;

}

// Example类中的普通方法

public function bark()

{

echo 'Woof!';

}

//阻止用户复制对象实例

public function __clone()

{

trigger_error('Clone is not allowed.', E_USER_ERROR);

}

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值