您现在的位置是:首页 > 后端 > PHP PHP
面对对象笔记
2020-05-17【PHP】1730人已围观
简介●面对对象编程 面对对象编程的一种思想。 面对过程:将每个步骤,分别实现,以此调用即可。 面对对象:1)确定对象所具有的属性 2)为对象增加相应的能力 3)让每个对象分别调用器的能力完成业务逻辑 ⊙为什么要面向对象 1)可重复使用 2)传值即可调用 3)单独存在 ⊙对象object 复合型数据类型,一个对象可以多次使
●面对对象编程
面对对象编程的一种思想。
面对过程:将每个步骤,分别实现,以此调用即可。
面对对象:1)确定对象所具有的属性 2)为对象增加相应的能力
3)让每个对象分别调用器的能力完成业务逻辑
⊙为什么要面向对象
1)可重复使用 2)传值即可调用 3)单独存在
⊙对象object
复合型数据类型,一个对象可以多次使用
实体对象:现实业务逻辑中的实体,在计算机语言中的映射。
对象具有属性property、方法method。
⊙如何得到对象
设计对象结构(定义类),依据结构得到对象(实例化类);
⊙定义类class
类:对象的抽象称为类,类决定了对象的结构。
⊙类与对象的关系
图纸与建筑物的关系。
内存关系:类是代码区,编译好待执行的代码,
对象是数据区,代码运行时所保存数据的地方。
class 类名{
public $name; public $age;
public function ech(){ echo "food"; }
}
⊙类名不区分大小写,类名支持可变类名,实例化时类名可以是变量
$name='tom'; $stud= new $name;
⊙实例化new
实例化:依据类结构,制作对象的过程。
$s = new student;
!!先声明类,在实例化
先实例化没报错是因为:计算机识别php语言要先预处理编译。
⊙操作对象->
访问成员,利用->语法 $对象名->属性或方法
!!利用函数property_exists()判断属性是否存在
isset函数在当属性值为null值时,会判断false;
var_dump(isset($stud->name));
property_exists($stud,"name");
支持可变变属性
$name='tom'; $stud->$name;
⊙局部变量$this 用于保存当前对象的引用,谁调用方法谁就是当前对象
⊙局部变量self::永远代表其所在类
Parent:: 父类
⊙对象的比较,同一个类并且属性相同则相等,同一个类标识一致才全等
⊙instanceof运算符,判断对象是否为某个类的实例(对象)
var_durp(实例化对象名 instanceof 类名);
●构造方法__construct()
构造方法:在对象被实例化的过程中,被自动调用的方法,
作用于对对象进行初始化工作。
实例化时,可以为构造方法传参。
public function __construct($n,$y){$this->name=$n;$this->pwd=$y;}
实例化传参 $s = new Student("pwd123","123456");
●析构方法__destruct()
在对象被销毁过程中,被自动化调用的方法,称为析构方法。
1)将对象数据持久化
public function start(){echo"死循环";}
public function __destruct(){$this->start();};
2)释放对象占用的额外资源,如mysql的链接资源
unset(对象);
public function __destruct(){mysql_close($this->link);}
●访问修饰限定符
用于限定成员属性、方法在哪里可以访问的关键字public,protected,private
public公共的 protected保护的 private私有的
!!基于成员访问位置与成员定义位置,php代码分为三个区域
1)本类类,访问位置与定义位置,处于同一类
2)继承链内,访问位置在定义位置的子类或父类
!!私有成员不能被重写,可以被继承,
导致的语法结果,在那个类中访问到的是哪个类中定义的成员。
3)类外。除了本类内,与继承链上类内都属于类外。
⊙public公共的 成员可以在类、类外、继承链都可以访问
⊙protected保护的 类中吗,与继承链上可以访问
⊙private私有的 只有本类中可以访问
●对象的克隆clone
通过已有对象,得到一个属性一致的新对象
新对象=clone 旧对象;
克隆后将会对新对象某些属性加以处理,区分克隆后的版本
⊙__clone()方法,用于在克隆时自动被执行,用于完成新对象某些属性的初始化
public function __clone(){$this->alpha=50;}//$this 是克隆后的对象
●类常量const
属于类的常量,称为类常量。将常量数据与某个类关联起来。
⊙常量的声明: const 常量名 = 值;
类常量不受访问修饰的控制,不需要使用public等关键字。
const,关键字可以用于声明普通常量,但在类中需要为常量设定
固定值,因为const是预处理,在语法编译时需要确定的值。
⊙访问:类名::常量名
Goods::CL; 类里面用self::常量名称
!!⊙ ::称为范围解析操作符。
⊙类常量的作用
1)在语法层面上限制数据不能被改变
2)说明作用,便于理解。const sex1=1; Goods::sex1;
●静态变量static
被static修饰的成员属性和方法,保存在静态内存区。static $变量名
在类外调用: 类名称::被static修饰的成员或方法
在类里调用: self::被static修饰的成员或方法
!! $this 关键字不能出现在静态成化成员方法中,静态化成员方法不能访问
非静态化的成员方法和成员属性
●继承extends
定义:如果一个对象A,使用了对象B的成员,称为A对象继承自B对象。
语法:class A extends B{需要继承的属性}
例:商品出售,手机与书本都有公用属性名字跟价格
class Goods{
public $name;
public $price;
public function fun(){echo "string"}
}
class Phone extends Goods{
public $color;
public $mode;//型号
}
class Book extends Goods{
public $writer;//作者
public $publisher;//出版社
}
$p = new Phone;
继承在语法上体现了oop中语法的重用。
echo $p->fun();
!!继承不是将父类中的代码复制到子类中,而是在两个类中建立了联系。
⊙单继承
一个类只能存在一个父类,但一个类可以被多个类继承。
●重写override
当子类成员名字与父类发生冲突时,子类访问的成员是子类自己的成员。
作用:允许多个子类中出现的一些特例情况,不同于父类的属性值。
!!如果要强制执行被重写的父类:
使用parent关键字,parent表示父类的意思,格式parent::
例如常见的构造、析构、克隆、名字固定方法:
class Phone{
public $color; public $mode;
public function __construct($color,$mode);
parent::__constrct($name,$price);
$this->color=$color; $this->mode=$mode;
}
parent,self的区别:parent::父类,self::子类;
●魔术方法
⊙__toString()
在以字符串形式输出类对象时,魔术方法__toString()会被自动调用。
在__toString()要return一个字符串。return的字符串可以作为对当前类的说明。
⊙__call()
在访问类中不存在的成员方法时,魔术方法__call()会被自动调用。
魔术方法__call()需要两个参数。第一参数是访问的不存在的成员方法的名称。第二个参数是访问不存在的成员方法的参数。第二个参数格式是数组。将多个功能相似的成员方法写入到__call()。
⊙autoload()
在类被实例化时会被自动访问,autoload魔术方法必须要求一个参数
作用:自动
function __autoload($classname){
include $classname.".php";
}
$p = new Mobile;
//通过映射方法获得类
function __autoload($classname){
$class = array('Book'=>'../common/Book.class.php');
$class = array('Goods'=>'./Goods.class.php');
$class = array('Phone'=>'./Phone.class.php');
require $class['$classname'];
}
//规律推导:适合扩展,
if(substr($classname,0,5)=='commo'){
require "./commo/".class.php;
}
●单例模式(单件模式)
保证类对象被实例化一次。
1、将构造方法私有化,这样类就不能在类外被实例化
2、定义一个成员方法,在成员方法中实例化当前类。
3、将成员方法定义为静态。在成员方法中返回类对象。
4、定义一个静态化的变量,设初始值为null,每次实例化之前,判断静态化的变量是否为null, 仅仅在静态化的变量为null时,初始化类对象。
用途:
防止多次实例化类对象,内存被多次分配,减少内存浪费。
●final
- 被final修饰的类不能被继承。
- 被final修饰的成员方法不能被重载。
- final不能用来修饰成员属性。
其作用:限制子类中必须存在,而且实现是相同的功能。
●abstract抽象类:仅仅可以被继承,不能被实例化
abstract class 类名
抽象方法: abstract public function Bool();
如果一个方法为抽象方法,指的是:仅仅存在方法的声明
部分(方法名,方法参数),而没有方法的实现部分(方法体)的方法
!!如果一个类中,包含了抽象方法,那么该类必须被声明为抽象类。
作用:要求继承包含抽象方法的抽象类的子类,必须将抽象方法重写实现。
除非,将子类定义成抽象类。
作用:可以在类中限制子类中必须存在,但是可以实现不同的方法
●接口 interface
接口技术:用于限定对象应该具有的公共接口方法的一种技术。
interface 接口名称{
//接口中不能有普通的成员方法和成员属性。仅能有常量和抽象方法。
function getdata();
}
在接口中的抽象方法不能出现关键字 abstract.
- 接口同样不能被实例化。用来定义规范。接口在项目中是用来被继承的。
类对于接口的继承:implements
接口对于接口的继承:extends
- 类继承接口,则必须重载接口中的全部抽象方法。
- 一个类可以同时继承一个抽象类和多个接口。
●●●PDO
PDO提供了抽象层数据操作的类。通过这个类可以对数据库进行操作。
打开extension=php_pdo_mysql.dll
应用 PDO(string $dsn,string $username,string $password)
$dsn = "数据库类型,数据库地址,数据库名称";
$dsn = "mysql:host=localhost;dbname=itcast";
$pdo = new PDO($dsn,"root","root");
⊙exec(string $query); 对与没有返回结果集的sql语句进行操作,返回被影响行数,false
⊙lastInsertId()返回最近一次成功插入数据的id,要求id是自增涨。
⊙query(string $query)对于有结果集的sql语句进行操作
●PDO的准备语句
⊙1)编译prepare(string $query); 只编译,不执行。返回是PDOStament类对象
$s = $pdo->prepare($query);
⊙2)绑定 bindparam(string $key,string $value);
$s->bindParam(":name",$name);
⊙3)执行 execute() PDOStament类对象通知mysql执行sql语句
⊙4)fetch([int $fetch_style])
功能:获取查询结果。
参数:
fetch_style PDO::FETCH_BOTH 获取的结果格式是关联数组和索引数组。
PDO::FETCH_ASSOC 获取的结果格式是关联数组。
PDO::FETCH_NUM 获取的结果格式是索引数组。
返回:获取一行查询结果。当获取不到时返回false。
$result = $statm->execute();
print_r($statm->fetch(PDO::FETCH_BOTH));
⊙5)获取被影响的行数
rowCount()
功能:获取 insert、update、delete、select被影响行数
返回:被影响的行数
echo $statm->rowcount();
===============
PDO中完成事务处理
$dsn = "mysql:host=localhost;dbname=itcast";
$pdo = new PDO($dsn,"root","root");
//关闭自动提交
$pdo->setattribute(PDO::ATTR_AUTOCOMMIT,0);
//开启事务
$pdo->beginTransaction();
//
$sql = "update bbb set age=age-10 where id=1";
$result1 = $pdo->exec($sql);
$sql = "update bbb set age=age+10 where id=2";
$result2 = $pdo->exec($sql);
if($result1 && $result2){
echo "成功";
}else{echo "失败";}
// 开启自动提交
$pdo->setattribute(PDO::ATTR_AUTOCOMMIT,1);
==================
单利模式
//6、定义Single类,对该类实现单例模式。
class Single{
static $obj = null;
//禁止类在类外被实例化,构造方法私有化
private function __construct(){
}
//在类里实例化类获取类对象
static function getObj(){
/*
* 判断静态化成员属性obj是否为空
* 若为空则进行实例化,并把实例化后的结果
* 负值给静态化成员属性obj,此时
* 静态化成员属性obj不为空,里面存储着类对象
* 若不为空,则不进行实例化,直接将
* 静态化成员属性obj里面装的类对象直接返回
*/
if(is_null(self::$obj)){
//此时 self::$obj 存储Single类的类对象
self::$obj = new Single;
}
return self::$obj;
}
}
//在类外对成员方法的访问:
//类对象->成员方法
//类名称::成员方法
$s = Single::getObj();
$s1 = Single::getObj();
关注博客,更多精彩分享,敬请期待!
Tags:
很赞哦! (0)
相关文章
随机图文
-
css动画
> 在CSS动画中,如果你想让元素的 border-radius 从50%逐渐变为0%,你可以使用 @keyframes 规则来定义这一变化过程。以下是一个简单的示例: ```css /* 定义一个动画 */ @keyframes borderRadiusChange { 0% { border-radius: 50%; } 100% { border-radius: 0; } } /* 将动画应用到某个元素上 */ .someElement -
bat锁屏和熄屏 windows
bat锁屏和熄屏 windows -
PHP中判断字符串是否含有中文
## 判断全是中文 > 方法一 ``` $str = '吾爱编程'; if (preg_match_all("/^([\x81-\xfe][\x40-\xfe])+$/", $str, $match)) { echo '全部是中文'; } else { echo '不全是中文'; } ``` > 方法二 ``` $str="'吾爱it编程"; if(!eregi("[^\x80-\xff]","$str")){ echo "全是中文"; -
PHP日历
PHP日历小案例