一、在oop中有一个模式叫做单例模式,那什么是单例模式呢?
PHP单例模式,就是一个对象只被生成一次,但该对象可以被其它众多对象使用。
在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
单例模式使用最多的场景,是数据库连接操作。我们知道,生成一个对象的操作是用new函数来实现,但是new对象都会消耗内存,而且有时候对同一个对象,在不同文件中可能会生成多 次,这就造成了系统资源的浪费。然而使用单例模式,则可以很好的避免这种情况。
单例代码如下:
使用单例模式有下面几个要求:
1.构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化;
2.拥有一个保存类的实例的静态成员变量;
3.拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化);
4.如果严谨的话,还需要创建__clone()方法防止对象被复制(克隆)。(我上面没创建)
使用单例模式好处,总结:
1、php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。
2、如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分。
3、在一次页面请求中, 便于进行调试。
二、在PHPOOP中还有一种方法叫魔术方1、在 PHP 里,将所有以 __(两个下划线)开头的类方法保留为魔术方法,所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。
魔术方法的引入是对面向对象编程思想的进一步实现,重载就是通过魔术方法来实现的。
2、PHP 魔术方法主要有: __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(),__sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo()
最常见的是__construct(), __destruct(),__get(), __set()等:
__construct和__destruct是类的构造函数和析构函数。
3、魔法方法总结
1、__construct():构造函数,new一个新对象时自动调用
2、__destruct():析构函数,当一个对象被销毁前自动调用
3、__get(): 访问类中私有属性时,自动调用,传递读取的属性名,返回$this->属性名
4、__isset():使用isset函数检测对象私有属性时,自动调用,传递检测的属性名,返回isset($this->属性名)
5、__set():各类的私有属性赋值时,自动调用,传递需要设置的属性名和属性值
6、__unset():使用unset()删除对象私有属性时 自动调用,传递删除的属性名,方法中执行unset($this->属性名)
7、__toString():使用echo打印对象时,自动调用。返回想要在打印对象时,显示的内容;返回必须是字符串;
8、__call():调用一个类中未定义或未公开的方法时,自动调用。传递被调用的函数名,和参数列表数组;
9、__clone():当使用clone关键字,克隆一个对象时,自动调用。作用是为新克隆的对象进行初始化赋值;
10、__sleep():对象序列化时,自动调用。返回一个数组,数组中的值就是可以序列化的属性;
11、__wakeup():对象反序列化时,自动调用。为反序列化新产生的对象,进行初始化赋值;
12、__autoload():需要在类外部声明函数。当实例化一个未声明的类时,自动调用。传递实例化的类名,可以使用类名自动加载对应的类文件。