php面向对象二

一、静态成员

静态的成员包括(静态属性和静态方法)

static修饰的属性和方法都是静态的

访问静态成员,必须使用self关键字和 :: 操作符

静态变量属于静态存储方式,其存储空间为内存中的静态数据区,该 区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),直到整个程序运行结束。

静态成员在类内的访问,可以使用self代替类名。

静态成员在类的外部访问时,必须使用类名和操作符::  ,而不需要创建对象。

 

二、单例模式

单例模式,指一个类只有一个对象实例,无法创建第二个对象。

单例模式的设计规范:三私一公

私有的构造方法:禁止在类外无限实例化对象

私有的克隆方法:禁止对象无限克隆对象

私有的静态属性:保存类内部实例化得到的对象

公有的静态方法:允许外部通过调用类内部方法获取对象

封装单例模式的类时,需要注意:

  1. 只提供私有的构造函数,
  2. 含有一个该类的静态私有对象,
  3. 提供一个静态的公有的函数用于创建或获取它本身的静态私有对象。
  4. 有一个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() 提供了一种更加灵活的方式来实现类的自动加载。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值