FavoriteLoading
0

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

回顾

面向对象:将自然界中的实体抽象出来,形成类。与面向过程相对,面向过程是指将一个事务分解成各个功能,然后对功能使用函数进行封装,在使用的时候调用函数即可。

 

面向的对象的基本概念:类,对象,实例化,抽象

 

类成员:属性,方法和类常量

 

访问限定修饰符:public,protected,private,var

 

魔术方法:在某些情况下会被自动触发的方法

语法:__(英文环境下的两个下划线)

 

__construct():构造方法,在对象被实例化之后,新生成的对象去调用方法,用来初始化对象里的属性

__destruct():析构方法,在对象被销毁的时候会自动调用,释放内存

unset:将指向内存的变量的指针给段掉

更改变量值:

等待脚本结束

 

对象的比较:==和===

对象的传值:默认是引用传值

封装DB类

类是一个工具,在需要的时候去调用他使用他。类里面不包含任何数据,所有数据的来源应该全部依赖在调用的时候外部传入。

mysql_connect

mysql_query

$sql = “insert into pro_student values(null,…..)”;

mysql_query($sql);

 

$db = new DB;

$sql = “insert into pro_student values(null,…..)”;

$db->insert($sql);

 

 

加载

如果要使用一个类来创建对象,那么必须先保证该类已经加载到内存,才能创建对象。

使用require或者include将需要使用的类文件给加载进来,然后才可以创建对象去使用。

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

在引入类文件的时候,需要每次都手动去加载文件。尤其是当脚本文件很大,需要使用很多类的时候,就需要加载很多类。PHP提供了一种机制,当类被使用的时候,系统会自动先判断当前内存里是否已经有该类,如果没有,会去指定的路径假面加载类文件。

 

自动加载

语法:__autoload(),魔术函数

参数:string $class,是一个类名,需要加载的类名

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

__autoload()只是提供了一个机制,能够在需要类的时候,自动的去找,如果用户需要去获取指定路径下的类文件,那么需要在函数体里去实现。

__autoload()原理

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

正确的自动加载

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

类成员:属性,方法和类常量

类常量:在类里面定义的常量

常量定义:define(‘常量名’,’常量值’);

类常量语法:const 常量名 = 常量值

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

访问常量

  1. 不能使用对象访问
  2. 只能使用类访问

语法:类名::常量名

:::范围解析操作符,专门用于类来访问类内部的数据或者方法

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

在类中有没有一中方法能够直接代替类名?self

self:自己的意思,只能在类内部使用,代替当前类名

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

类能够访问自己的普通方法,但是会报一个错误(严格错误),原因是因为方法是用户对象访问(普通方法)

类不能访问普通属性

 

类能访问的东西

类常量

静态属性

静态方法

(普通方法)会报错

 

静态:静态属性静态方法

静态属性:访问限定修饰符static 属性名

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

静态方法:访问限定修饰符 static function 方面名字

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

如何访问静态属性和方法?

通过类访问:类型::静态属性或者静态方法

属性访问

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

方法访问

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

注意:静态属性或者方法的访问,不需要进行类的实例化

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

静态的属性和方法也受访问限定修饰符的控制。

总结

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

做一个简单的计数器:统计当前类有多少个对象。

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

魔术方法

__toString():将对象按照字符串输出

对象不能直接输出

当对象碰到echo进行输出的时候,系统会自动触发__toString()方法

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

__clone():在对象被克隆的时候会自动调用的方法

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

如何获得一个类的对象?

  1. new 类,实例化对象
  2. 克隆

 

self与$this的区别

  1. 都是在类的内部被使用
  2. self代表当前类,$this代表当前访问类方法的对象
  3. self能访问静态的属性和方法,$this能访问普通的属性和方法(也能访问静态方法,不建议这样用)

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

模式

设计某个东西一种方式。

 

单例模式:对应到面向对象,永远只能从一个类产生出一个对象。

 

如何保证一个类只有一个对象?

构造和克隆都能产生新对象

  1. 克隆方法私有化:使得克隆不能产生新对象
  2. 阻止在类的外部进行实例化

 

如何实现单例模式?

三私一公

三私:私有化构造方法,私有化克隆方法,私有化静态对象属性

一公:公有获得对象的静态方法

见代码demo08_single.php

 

DB类的单例模式:见代码SingleDB.class.php

 

魔术常量

__CLASS__:当前的类名

__METHOD__:当期方法

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

对象判断

is_object:判断当前变量是否是一个对象

instanceof:判断一个对象是否属于某个类

重蔚自留地php学习第四十三天——自动加载-静态-魔术-单例

为何一个类要有普通方法和静态方法?

  1. 区分对象和类的操作
  2. 静态方法的执行效率比普通方法高(减少代码量,降低内存开销,提高效率)

用户管理类:类名Privilege

类需要实现的方法:注册,验证用户名,验证密码(两次是否一致,密码长度不能小于6位)

实现登陆方法:验证用户名和密码

信息都是通过DB类对象来进行数据库操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Privilege{
 
//属性用来保存db类的对象
 
 
//构造方法内连接数据库
 
Public function __construct(){
 
//加载DB类(使用自动加载)
 
//得到DB类的对象,保存在属性里
 
}
 
 
//注册
 
Public function register(){
 
//判断用户的数据是否合法
 
//组织SQL语句,密码使用md5加密
 
 
//调用DB类的插入方法
 
$this->属性->insert($sql);
 
 
}
 
 
//验证用户登陆信息
 
public function checkLogin($username,$password){
 
///判断参数的合法性
 
//对密码进行md5加密
 
//组织查询SQL语句
 
//$this->属性->getRow($sql);
 
//返回结果
 
}
 
}

注册:如果注册成功提示用户注册成功,进入到登录界面(跳转),不成功则回到当前界面

登录:登录成功提示用户,跳转到index.php界面,否则回到登录界面

欢迎分享本文,转载请保留出处!—重蔚自留地 站长邮箱:admin@cwhello.com