面向对象的基本概念
什么是类
类是由相同特征(属性、静态的)和行为(方法、动作)的一组对象构成
分类、类型、自定义类型
比如:人类...
什么是对象
对象就是一个一个的实体,看得见、摸得着
比如:任何一个人的个体都是一个对象
类和对象的关系
类的实例就是对象,对象的抽象就是类
比如:将人类实例化才有人的个体,
所有的人都可以抽象的说他属于人类
类的定义和类的实例
类的定义:
class 类名{
类中成员;
}
举个栗子:
<?php
class Person {
//成员属性: 姓名、性别、年龄、身高、体重、电话等 -- 静态描述
var $name;
//成员方法:说话、学习、走路、吃饭、开车、敲代码等 -- 动态描述
function say() { //声明第一个成员方法,定义人说话的功能
//方法体
}
}
?>
类的实例:
通过关键字new 来声明一个对象,并使用 对象名->成员属性/方法 操作对象属性
举个栗子:
<?php
class Person {
public $name;
public function say() {
echo '哇哦~哇哦~哇哦~哇哦!';
}
}
$person = new Person();
$person->name = '小团团';
echo "person的名字是:".$person->name."";
$person ->say();
?>
类常量
常量是不会改变的值,是一个恒值
定义常量使用关键字const
常量输出格式 类名::常量名
注意:在定义和使用常量的时候不需要使用 $ 符号
举个栗子:
<?php
class Person {
const PERSON_NAME = ''人类'';
}
echo Person::PERSON_NAME;
?>
$this的使用
变量 this->可以调用类中方法,$this只能用在成员方法中,其它任何地方都不能使用。
举个栗子:
<?php
class People {
public $name;
function setName($par){
$this->name= $par;
}
function getName(){
echo $this->name;
}
}
$tuantuan= new People ;
$tuantuan->setTitle( "一条小团团" );
// 调用成员函数,获取名字
$tuantuan->getTitle();
?>
封装/继承/多态
定义成员变量时的关键字:public、private、protected
public -- 公开成员,可以在程序中的任何位置(类内/外)被其他的类/子类和对象调用。
private -- 私有成员,只能在所属类的内部被调用和修改,不可以再类外/子类被访问
protected -- 保护成员,在本类和子类中被调用,其他地方则不可以被调用
封装:
也可以称为信息隐藏,封装后对外只提供可操作的方法,不会告诉你内部结构。封装一个类需要两步 第一步是私有化一个类 第二步是用set和get 做出读取赋值的操作
预定义两种函数来进行获取与敷值操作
__get 获取值
__set 设置值
<?php
class Person {
private $name;
private function __get($property_name) { //__get()方法用来获取私有属性
echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br>";
if(isset($this->$property_name)) {
return($this->$property_name);
} else { return(NULL); }
}
private function __set($property_name, $value) { //__set()方法用来设置私有属性
echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br>";
$this->$property_name = $value;
}
}
$p1=newPerson();
$p1->name="张三"; //直接为私有属性赋值的操作,会自动调用__set()方法进行赋值
echo "年龄:".$p1->name."<br>"; //直接获取私有属性值,会自动调用__get()方法,返回成员属性值
?>
继承
继承:子类可以继承父类的属性和方法,但是是有限继承,public、protected、private三个修饰的属性都可以继承,public、protected两个修饰的方法可以继承,父类的常量可以继承。
extends声明继承关系
语法格式:class B extends A 此范例指明 B继承了A
子类继承父类的所有内容,但父类中的private部分不能直接访问
子类中新增加的属性和方法是对父类的扩展
子类中定义的与父类同名的属性是对父类属性的覆盖,同名的方法也是对父类方法的覆盖
重写的方法
在子类中,使用parent访问父类中的被覆盖的属性和方法
parent::__construct();
parent::$name;
parent::fun();
clone克窿对象 语法格式
$c=clone $p;
p 输出
echo $c->name;
多态
多态:同一个操作(函数)作用于不同的类的实例,将产生不同的执行结果
举个栗子:
<?php
class Animal{
public $name;
public $price;
function talk(){
echo 'wu wu wu';
}
}
class Dog extends Animal{
//覆盖、重写
function talk(){
echo 'Wang Wang!';
Animal::talk();//这里不会报错,能正确执行父类的talk();
}
}
$dog1=new Dog();
$dog1->talk();
?>
构造方法和析构方法
构造方法:生成对象时自动执行的成员方法,作用就是初始化对象。该方法可以没有参数,可以有多个参数。定义构造方法:void __construct (arg)
举个栗子:
<?php
class Person{
public $name;
public $age;
function __construct($p1, $p2){//使用构造方法给自己的成员属性赋值
$this->name = $p1;
$this->age = $p2;
}
function say(){
echo "我叫{$this->name},我今年{$this->age}<br>";
}
}
$person= new Person('小仙女', 18);
$person->say();
?>
析构方法:与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数,作用时释放内存。定义析构方法: void __destruct()
举个栗子:
<?php
class Person{
public $name;
function __construct($p){
$this->name = $p;
echo "我的名字是{$this->name},很高兴认识你。<br>";
}
//声明一个析构方法,在对象销毁前自动调用
function __destruct(){
echo "感谢相遇{$this->name}先生,珍重!<br>";
}
}
$person= new Person('易烊千玺');
?>
静态变量和静态方法
static -- 静态成员,不需要实例化对象即可使用,在对象被销毁后仍可保存被修改的值
写法:
static $属性名/static fun()
使用:
类名::$属性名/类名::方法名
举个栗子:
<?php
class Math{
static $a = 0;
static function b ($x,$y){
$q = $x + $y;
return $p;
}
}
$matn_a = Math::$a;//调用类中的静态属性
var_dump($matn_a);
$math_b = Math::b(2,3);//调用类中的静态方法
var_dump($math_b);
?>