php学习之旅第七天

1.静态变量

概念:使用static关键字修饰的类成员,表示该成员属于类访问
静态成员:

  1. 静态属性
  2. 静态方法

静态成员是明确用来给类访问的,而不是对象
静态成员只是多了static关键字修饰,本身也可以被对象访问
静态成员同样使用访问修饰限定符限定,效果一致

class Saler{
	
	public static $PI = 3.14;
}
echo Saler::$PI;

静态方法同上

对象可以直接访问静态方法,但是不能直接访问静态属性,需要借助范围解析操作符::
虽然可以但是禁止以上操作
因为类只允许访问静态成员和类常量

注:静态方法本质是给类访问,所以不允许在静态方法内部 使用$this

2.self关键字

作用:在类的内部(方法里面)使用,代替类名的写法
可以保障用户方便修改类名
用法:

  1. self关键字是代替类名,所以需要配合范围解析操作符::
  2. 可以用在类的内部实例化对象

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;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值