一、静态成员
静态的成员包括(静态属性和静态方法)
用static修饰的属性和方法都是静态的
访问静态成员,必须使用self关键字和 :: 操作符
静态变量属于静态存储方式,其存储空间为内存中的静态数据区,该 区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),直到整个程序运行结束。
静态成员在类内的访问,可以使用self代替类名。
静态成员在类的外部访问时,必须使用类名和操作符:: ,而不需要创建对象。
二、单例模式
单例模式,指一个类只有一个对象实例,无法创建第二个对象。
单例模式的设计规范:三私一公
私有的构造方法:禁止在类外无限实例化对象
私有的克隆方法:禁止对象无限克隆对象
私有的静态属性:保存类内部实例化得到的对象
公有的静态方法:允许外部通过调用类内部方法获取对象
封装单例模式的类时,需要注意:
- 只提供私有的构造函数,
- 含有一个该类的静态私有对象,
- 提供一个静态的公有的函数用于创建或获取它本身的静态私有对象。
- 有一个private的clone方法,防止克隆;
<?php
class Db{
//静态属性,保存生产出来的对象
private static $object = NULL;
//私有的构造方法
private function __construct(){
echo __METHOD__,'</br>';
}
//类入口,允许进入类内部
public static function getIn(){
//判断静态属性是否存在当前类的对象
if(!(self::$object instanceof self)){
//当前保存的object数据不是Db的对象
//产生对象
self::$object = new self();
}
//返回对象
return new self();
}
//私有的克隆方法
private function __clone()
{
// TODO: Implement __clone() method.
}
}
//实例化
//$s1 = new Db;
//$s2 = new Db;
//静态方法进入到类内部
$s = Db::getInfo();
$s1 = Db::getInfo();
//克隆对象
//$s2=clone $s;
//var_dump($s,$s1,$s2);
三、对象之间的赋值于clone
对象之间的赋值,实际就是引用赋值,两个对象之间赋值后,就是一个对象了。所以当一个对象的内容发生变化后,另一个对象的内容也会发生变化。
<?php
class Student
{
public $name;
}
$s1 = new Student();
$s1->name = '张三';
//对象之间赋值
$s2 = $s1;
$s2->name = '李四';
echo $s1->name;
echo '<br>';
echo $s2->name;
普通变量之间的赋值,如果也想使用引用赋值,必须使用&,如:
$name2 = &$name1
那么,$name1和$name2也变成了同一个变量,它们之间相互影响
克隆后的对象,不会对原对象产生影响。
四、命名空间
命名空间一个最明确的目的就是解决重名问题
<?php
namespace model; //定义命名间
//类Student在model命名空间中
class Student
{
public function say(){
echo 'hello';
}
}
测试文件
<?php
use model\Student as Stu; //引入 model命名空间的Student 类,并重命名为Stu
require_once 'student.php';
$stu = new Stu();
$stu->say();
使用命名空间中的类,必须引入:use model\Student,引入类时可重新命名,原有的类名不能再用。
五、魔术方法之autoload
PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods)
如:构造方法__construct,析构方法 __destruct;
魔术方法包括:
__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息
__autoload(),这是一个自动加载函数,用于实例化一个未定义的类。
若没有包含student类文件,当使用student类时,会自动执行__autoload函数;
_autoload函数 :主要的功能就是构造需要加载的类文件的路径,然后包括包含类文件。这一切都是当程序找不到类文件时自动执行的。
六、spl_autoload_register取代__autoload
spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载。