1.静态变量
概念:使用static关键字修饰的类成员,表示该成员属于类访问
静态成员:
- 静态属性
- 静态方法
静态成员是明确用来给类访问的,而不是对象
静态成员只是多了static关键字修饰,本身也可以被对象访问
静态成员同样使用访问修饰限定符限定,效果一致
class Saler{
public static $PI = 3.14;
}
echo Saler::$PI;
静态方法同上
对象可以直接访问静态方法,但是不能直接访问静态属性,需要借助范围解析操作符::
虽然可以但是禁止以上操作
因为类只允许访问静态成员和类常量
注:静态方法本质是给类访问,所以不允许在静态方法内部 使用$this
2.self关键字
作用:在类的内部(方法里面)使用,代替类名的写法
可以保障用户方便修改类名
用法:
- self关键字是代替类名,所以需要配合范围解析操作符
::
- 可以用在类的内部实例化对象
3.类的加载
1. 手动加载
基本语法
#类文件:Saler.php
<?php
class Saler{}
?>
应用文件:useSaler.php
#使用Saler类需要先包含Saler类所在的文件
include_once 'Saler.php'; #通常使用include_once,因为类不允许重名
$s = new Saler();
但是直接加载比较消耗资源,且如果类已经在内存已经存在,直接加载会报错,所以可以执行一次判定:
if(!class_exists('Saler')){
include 'Saler.php';
}
$s = new Saler();
2. 自动加载
基本语法:
主要利用__autoload函数,当系统需要使用一个类,而内存中不存在的时候,系统就会自动调用__autoload()函数来加载类文件
# 定义实现自动加载
function __autoload($classname){
#组织文件路径:假设当前路径下有两个文件夹c和m下都有类
$c_file = 'c/'. $classname . '.php';
if(file_exists($c_file)){
include_once $c_file;
return true;
}
#c文件夹没有对应的文件
$m_file = 'm/' . $classname . '.php';
if(file_exists($m_file)){
include_once $m_file;
return true;
}
}
注:自动加载是指按照开发者规定的路径去寻找对应的文件,并实现包含。如果文件不存在,那么系统会在使用类的时候报错,因为这是开发者自己犯的错,系统不能规避
在php7以上后不建议使用__autoload
3.spl注册自动加载
本质与__autoload一样,但是是采用一种注册机制,将用户自定义的函数,放到系统内部,使用spl autoload register(定义好的函数)
上述autoload函数永远不会自动运行,除非将函数注册到系统内部
spl_autoload_register('函数名')
sql可以注册多个自定义的加载函数,更方便管理
4.对象克隆
定义:通过已有的对象复制一个新的同样的对象,但是二者之间并非同一个对象
基本语法:
class Saler{
public $count;
private $money;
}
$s1 = new Saler();
$s1->count = 1;
$s2 = clone $s1;
注:对象在实例化的时候会自动调用存在的__construct方法,同样,PHP中在类的内部允许定义一个新的__clone()的方法,在对象被克隆后,新克隆出来的对象会自动调用
克隆方法同样可以私有化
5.封装数据库操作类
1.构造方法
数据库的操作最基本的特性不会变:即需要连接认证,而连接认证的信息是灵活的,所以可以通过设定属性来控制,而这些信息根据不同使用者,也是不同的,应该可以改变,所以可以通过构造方法来实现数据传入
<?php
#数据库操作类
class Sql{
#定义属性:保存数据库初始化的信息
public $host;
public $port;
public $user;
public $pass;
public $dbname;
public $charset;
#实现数据的初始化:灵活性(允许外部修改),通用性:给定默认值
public function __construct($arr = []){
#完成初始化
$this->host = $arr['host'] ?? 'localhost';
$this->port = $arr['port'] ?? '3306';
$this->host = $arr['host'] ?? 'localhost';
$this->user = $arr['user'] ?? 'root';
$this->pass = $arr['pass'] ?? 'root';
$this->dbname = $arr['dbname'] ?? 'db_2';
$this->charset = $arr['charset'] ?? 'utf8';
}
}
测试:
#接上述代码(类外测试)
$s1 = new Sql(); #使用数据库默认信息
$db = array(
'host' => '192.168.0.1',
'user' => 'admin',
'pass' => 'admin',
'dbname' => 'Taobao'
);
$s2 = new Sql($db); #使用外部数据库信息
var_dump($s2);
2.连接认证
函数:iconv('字符集1','字符集2','所转信息');
#连接认证
public $link;
public $errno;
public $error;
public function connect(){
$this->link = @mysqli_connect($this->host,$this->user,$this->pass,$this->dbname,$this->port);
#加工结果
if(!$this->link){
#记录错误信息返回false
$this->errno = mysqli_connect_errno();
$this->error = iconv('gbk','utf-8',mysqli_connect_error());
return false;
}
#正确返回
return true;
}
3.设置字符集
#字符集设置
public function charset(){
#利用mysqli实现字符集设置
$res = @mysqli_set_charset($this->link,$this->charset);
#判定结果
if(!$res){
$this->errno = mysqli_errno($this->link);
$this->eror = mysqli_error($this->link);
return false;
}
#正确操作
return true;
}
4.SQL执行检查
#SQL执行以及错误检查
public function check($sql){
# mysqli_query执行
$res = mysqli_query($this->link,$sql);
#判定错误
if(!$res){
$this->errno = mysqli_errno($this->link);
$this->error = mysqli_error($this->link);
return false;
}
#成功返回结果
return true;
}
5.写操作
#写操作
public function write($sql){
#调用SQL检查方法和执行
$res = $this-> check($sql);
#根据结果判定:如果$res为ture,说明执行成功,应该获取受影响的行数,如果为false就返回false
return $res ?mysqli_affected_rows($this->link):false;
}
#获取自增长id方法
public function insert_id(){
#可以增加判定
return mysqli_insert_id($this->link);
}
6.读操作
读取一条记录(利用check进行SQL执行和错误检查):读取一条数据可能需要获取当前查询结果的列数,增加属性保留
#读取数据:一条记录
public $columes = 0;
public function read_one($sql){
#执行检查
$res = $this->check($sql);
#判定结果
if($res){
#有结果
$this->columes = @mysqli_field_count($this->link);
return mysqli_fetch_assoc($res);
}
#没有结果
return false;
}
#读取数据:多条记录
public $rows = 0;
public function read_all($sql){
#执行检查
$res = $this->check($sql);
#错误检查
if(!$res) return false;
$this->rows = @mysqli_num_rows($res);
$this->columns = @mysqli_field_count($this->link);
#循环取出所有数据
$list = [];
while($row = mysqli_fetch_assoc($res)){
$list[] = $row;
}
#返回结果
return $list;
}