PHP 面向对象

339 查看

类跟对象的关系
类是对象的抽象(对象的描述(属性),对象的行为(方法))

对象是类的实体

面相对象的三大特征:封装、集成、多态

自定义类
Class Person{

}

属性定义
属性是类里面的成员,所以要定义属性的前提条件是需要声明一个类

Class Person{
public $name;// 属性
public $age;
public $sex;
}

方法定义
方法是定义特定功能的代码块,在类中定义方法表示,创建对象之后,对象的特定行为;

Class Person{

public function eat($food){
    echo "Person can eat ".$food;
}

}

实例化对象
Class Person{

public $name;// 属性
public $age;
public $sex;

public function eat($food){
    echo "Person can eat ".$food;
}

}

$person1=new Person();

属性的赋值
$person1->name="curtis";
echo $person1->name;

类方法的调用
$person1->eat("Apple");

继承(PHP是单继承,也就是一个子类只能有一个父类)
为什么要继承?
回复:为了属性、方法的重复利用;

业务场景:
有个Person类,有一个Student类;
Person里面有姓名、年龄、性别
如果Student里面再将上面的属性定义一次,那就糟蹋了继承这个神器;

Person类叫Student类的父类,Student类是Person类的之类;

Class Person{

public $name;// 属性
public $age;
public $sex;

public function eat($food){
    echo "can eat ".$food;
}

}

Class Student extends Person{

public $student_id;

public function write(){
    echo "I can write";
}

public function read(){
    echo "I can read";
}

}

$student1=new Student();

$student1->name="curtis1";
echo $student1->name;
echo "<br />";

$student1->eat("面");
echo "<br />";

访问修饰符
public protected private

public 当前类,子类中均可访问;
protected 当前类,子类内部允许访问;
private 当前类内部允许访问;

这个地方需要重点了解:
范围

什么叫类内部?
{}内叫类内部,出了{},实例化对象的时候构造函数也是内内部;

Class Person{

public $name;// 属性
public $age;
private $sex;// 私有属性

public function eat($food){
    echo "eat ".$food;
}

function __construct($sex){
    echo "性别:".$sex;
}

}

Class Student extends Person{

public $student_id;

public function write(){
    echo "I can write";
}

public function read(){
    echo "I can read";
}

}

$person1=new Person("男");

static 关键字
为什么要有这么一个关键字?

常量
PI

静态属性 public static $PI = 3.14;
静态方法

静态成员访问方式(类外部):
类名::属性名称

在当前类中访问静态属性:
statis::属性名;

在子类内部访问父类静态成员,parent::属性名;statis::属性名;

class Person
{

public $name;
// 属性
public $age;

private $sex;
// 私有属性
public function eat($food)
{
    echo "eat " . $food;
}

public static $PI = 3.14;

/**
 * 构造函数
 */
function __construct($sex)
{
    echo "性别:" . $sex;
}

function show(){
    echo static::$PI;
}

}

class Student extends Person
{

public $student_id;

public function write()
{
    echo "I can write";
}

function __construct()
{}

public function read()
{
    echo "I can read";
}

public function add()
{
    echo 1 + parent::$PI."<br />";
    echo 2 + static::$PI;
}

}

$person1 = new Person("男");
echo "<br />";
$person1->show();
echo "<br />";
echo Person::$PI . "<br />";
$student1 = new Student();
echo Student::$PI;
echo "<br />";
$student1->add();

方法的重写
方法的重载

什么叫相同的方法,什么叫不同的方法?
回复:相同的方法:方法名称相同,方法的参数列表相同;
不同的方法:方法名称不同;方法名称相同,方法的参数列表不同;

为什么会有方法的重写?
回复:父类定义的方法子类有同样的方法,子类的中的方法要实现有自己的行为;

方法的重载
为什么会有方法的重载?
回复:类中同样一个方法名称,通过不同的参数传递实现各自的行为;

final关键字
跟方法的重写对应来的
父类中有一个final关键字修饰的方法,子类想对该方法进行重写那是不被允许的;

接口(interface)