面向对象
面向过程:
面向过程是一种以“整体事件”为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数
面向对象:
面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个“对象”;
对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象
类的定义
把有特点的东西集合到一起,将这些数据的形式和这些数据的操作封装到一起
对象是具有类类型的变量,是对类的实例
内部构成:成员变量(属性),成员函数(方法)
继承
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容
父类
一个类被其他类继承,可将该类称为父类,或基类,或超类。
子类
一个类继承其他类称为子类,也可称为派生类
类的结构
<?php
class hero{ // 定义类,类名
var $name;
var $sex; // 定义成员属性
function jineng($var1) { // 定义成员方法
echo $this->name; // 调用成员变量
echo $var1;
}
}
$sfj= new hero(); // 使用 new 运算符来实例化该类的对象
$sfj->name='永恩';
$sfj->id='001';
$sfj->jineng('双剑华斩')
print_r($sfj);
?>
类的修饰符
访问权限修饰符:对属性的定义
修饰符 | 作用 |
---|---|
public | 公共的,在类的内部、子部中或者类的外部都可使用,不受限制 |
protected | 受保护的,在类的内部、子类中可以使用,但能再类的外部使用 |
private | 私有的,只能在类的内部使用,在类的外部或者子类中都无法使用 |
运行后只能回显name
子类中只有私有属性不能使用
构造方法
_construct(),是一种类结构特有的特殊方法,系统已经规定好,在定义的时候只需使用即可,有了构造方法的类在实例化对象之后,对象就会自动调用
- 目标是为了实现对象的初始化
- 自动触发,不需要手动调用
class Saler{
# 属性
public $count;
private $money;
# 构造方法
public function __construct($count,$money)
{
$this->count = $count;
$this->money = $money;
}
}
$s1=new saler(100,2000);
var_dump($s1);
析构方法
_destruct(),对象被销毁时自动调用
因为脚步结束系统会自动回收资源,所以这个方法用得不多
对象传值
class Saler{}
$s1 = new Saler();
$s2 = $s1; # 对象传值
var_dump($s2,$s1);
# 验证是否操控的是同一个内存地址
$s1 -> name = 'sfj';
echo $s2->name;
可以得出对象赋值本质是一个对象,不会增加新的对象
范围解析操作符
由类名直接访问,类名::类常量
不要乱访问属性和方法,虽然可以,属性方法最好由对象来访问
类也也有需要对数据进行操作,这时候用类来访问
class Saler{
# 类常量
const PI = 3.14;
}
$s1 = new Saler();
# 不能通过 $s1->PI访问,会被当成$PI报错未定义
# 使用范围解析操作符
echo Saler::PI;
# $s1::PI 也行但不建议使用
静态成员
使用static关键字修饰的类成员,表示该成员属于类访问
明确用来给类访问,而不是对象访问
受访问限定修饰符限定
class Saler{
public $money = 0;
public static $count = 0; # 静态属性
# 静态方法
public static function showclass(){
echo Saler::$count; # 类的内部也可访问静态成员
echo __CLASS__;
}
# 非静态方法
public function showcount(){
echo __METHOD__;
}
}
echo Saler::$count;
# $s1 = new Saler();
# echo $s1 -> count; 这种访问会报错(动态访问不行)
# 静态方法访问
Saler::showclass(); # 访问成功
//Saler::showcount(); # 报错
类常量、静态的属性和方法是给类访问的
普通的属性和方法应该由对象访问
self关键字
在类的内部(方法里面)使用,代替类名的写法
- 如同 $this 代表内部对象一样,在方法内部代替当前类名
- 保障用户方便修改类名字
- self关键字是代替类名,需要配合范围解析操作符 ::
对象克隆
clone,通过一个已有对象复制一个新的相同的对象,但两者并非同一个对象
克隆对象会自动调用魔术方法 __clone(存在的前提)
封装数据库(连接认证)
<?php
# 通用工具类,数据变化多
class sql{
# 设置属性:初始化信息
public $host;
public $port;
public $user;
public $psaa;
public $dbname;
public $charset;
# 实现数据初始化:灵活性(允许修改)和通用性(给定默认值)
public function __construct(array $arr = []){
# 完成初始化
$this->host = $arr['host'] ?? 'localhost';
$this->user = $arr['user'] ?? 'root';
$this->pass = $arr['pass'] ?? 'root';
$this->charset = $arr['charset'] ?? 'utf8';
}
# 连接认证
public $link;
public $errno;
public $error;
public function connect(){
$this->link = @mysqli_connect($this->host,$this->user,$this->pass);
# 加工结果
if(!$this->link){
# 记录错误信息返回false
$this->errno = mysqli_connect_errno();
$this->error = iconv('gbk','utf-8',mysqli_connect_error());
return false;
}
# 正确返回
return true;
}
}
$s1 = new sql(); # 使用默认数据库信息
$db = array(
'host' => '192.168.0.1',
'user' => 'admin',
'pass' => 'admin',
);
$s2 = new sql($db); # 使用外部数据库信息
var_dump($s1->connect());
echo $s1->errno,$s1->error;
mysqli_connect()函数:
该函数用于建立到MySQL数据库的连接
它接收5个参数:主机名、用户名、密码、数据库名和端口号
如果连接成功,则返回一个MySQLi连接资源对象,否则返回false
mysqli_connect_errno()属性:
该属性返回最近一次MySQLi连接操作的错误代码
如果没有错误发生,则返回0
mysqli_connect_error()属性:
该属性返回最近一次MySQLi连接操作的错误信息
如果没有错误发生,则返回空字符串
$errno属性:该属性用于记录MySQLi连接错误代码。
$error属性:该属性用于记录MySQLi连接错误信息
设置字符集
# 字符集设置
public function charset(){
# 利用mysqli实现字符集设置
$res = @mysqli_set_charset($this->link,$this->charset);
# 判定结果
if(!$res){
$this->errno = mysqli_errno($this->link);
$this->error = mysqli_error($this->link);
return flase;
}
# 正确操作
return true;
}
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 $res;
}
$s1 -> check('select * from test');
# 因为没有test这个表,SQL语句错误
SQL写操作
# 写操作
public function write($sql){
# 调用SQL检查方法检查和执行
$res = $this->check($sql);
# 根据结果判定,如果$res为true,说明执行成功,获取受影响的行数,如果为false就返回false
return $res ? mysqli_affected_rows($this->link) : false;
}
# 获取自增长ID方法
public function insert_id(){
# 可以增加判定
return mysqli_insert_id($this->link);
}