什么是面向对象?
准确的说面向对象编程我们叫 OOP,面向对象的编程分为三部分:面向对象分析(Object Oriented Analysis,OOA)、面向对象设计(Object Oriented Design,OOD),以及面向对象编程(Object Oriented Programming)。面向对象编程的两个中个重要的概念是类和对象。
面向对象的三大特征
- 封装性
把相同的属性和方法抽象成一个类叫做封装 - 继承性
子类继承父类的属性和方法叫做继承。我们可以重写和添加新的属性方法。在PHP 中支持的是单继承。一个子类有且只有一个父类。 - 多态性
同一个类的不同对象,调用同一个方法可以获得不同的结果叫多态(增强程序的灵活性和重用性)
PHP 对象
类的定义
PHP 通过 class 关键字加类名来定义类
<?php
class Person{
}
?>
成员方法
类中的函数被称为成员方法
<?php
class Person{
function man(){
}
}
?>
类的实例化
通过 new 关键字 实例化对象,通过对象->成员方法 来调用成员方法。
class Per{
function man($name, $age)
{
echo $name;
echo $age;
}
}
$m1 = new Per();
echo $m1->man('小明','22');
成员变量
类中的变量,也称为成员变量。有些人也把它叫做属性或者字段。成员变量的是用来保存数据信息。(访问成员变量和成员方法的方法一样,对象->成员变量)
定义成员变量和成员方法:
<?php
class Per{
// 声明成员变量
// 关键字(修饰符) 成员变量名
// 关键字有public ,private, protected, static
public $name;
public $age;
public $money;
public function man($name, $age,$money){
echo $name.'今年'.$age.'工资是'.$money;
}
}
$m1 = new Per();
$m1->man('小明',22,4000);
?>
类常量
常量是不可改变的量,是一个恒值,举例圆周率就是一个常量。使用关键字 const定义常量。
class Per{
// 通常常量用大写字母
const WORK='搬砖';
}
echo Per::WORK;
构造函数和析构函数
构造函数
当一个类实例化为一个对象的时候,可能可能会随着对象的初始化而初始化一些成员变量。就是给一些成员变量赋值。这种情况下我们就可以使用构造函数。因为对象实例化过程中构造函数是自动执行的。
析构函数
析构函数的作用和构造方法方法刚好相反,是对象被销毁时被调用的,作用是释放内存。
<?php
class Person
{
// 公共成员变量名
public $name;
public $age;
public $sex;
public $type = "人类";
// 构造函数
// 原来给成员变量赋值
// 在对象开始实例化的时候 自动执行
public function __construct($name, $age, $sex)
{
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
//析构函数 在对象被销毁的时候 自动执行
public function __destruct()
{
echo "$this->type.对象被销毁,已释放";
}
}
$p1 = new Person('小龙', 18, 0);
print_r($p1);
继承和多态
继承
子类继承父类的所有成员变量方法,包括构造方法,当子类被实例化的时候,PHP 会先在子类当中找构造方法,如果子类已经有自己的构造方法。PHP 会先调用子类的方法。当子类当中没有的时候,PHP 才会去调用。父类当中的构造方法,这就是继承。
<?php
class Person
{
// 公共成员变量名
public $name;
public $age;
public $sex;
}
// 继承
// 将person当成父类
// man继承父类 person 的属性和方法
class Man extends Person
{
public function money()
{
echo '小龙赚钱';
}
}
$m1 = new Man('小刘', 23, 1);
$m1->money();
多态
<?php
class Animal
{
public $name;
public $sound;
public function say(){
echo $this->sound;
}
public function __construct($name1,$sound){
$this->name=$name1;
$this->sound=$sound;
}
}
class Dog extends Animal{
}
class Cat extends Animal{
}
class Sheep extends Animal{
}
function asay($obj) {
$obj->say();
}
$m1=new Dog('猫猫','喵喵');
$m2=new Cat('狗狗','汪汪汪');
$m3=new Sheep('羊羊','咩咩咩');
asay($m1);
asay($m2);
asay($m3);
操作符
PHP通过为变量this->和域的操作符"::"来访问自己的成员变量和成员方法
- this->
在类内部我们可以通过this访问当前实例化对象,调用方法或成员变量的话则使用 "this->成员变量" 、 "this->成员方法" 来访问。所以 this-> 只在类的内部使用
-操作符::
$this只能在类的内部去使用。操作符"::"可以在没有声明任何实例的情况下,访问类当中的成员方法或成员变量。(关键字::变量名/常量名/方法名
)
parent: 可以调用父类中的 成员变量,成员方法和常量
self:可以调用当前类中的 静态成员和常量
类名:可以调用本类中的静态变量,常量和静态方法
<?php
//A 类
class A
{
const Type = 0;
const NAME = "A";
function a(){
// echo self::Type.self::NAME;//0,A
// echo "<br>";
}
}
class B extends A
{
// 子类独有的方法
const Type = 1;
const NAME = "B";
public function a()
{
// echo parent::Type .parent::NAME;//0,A
// echo "<br>";
// echo self::Type.parent::NAME;//1,A
}
}
$a1 = new A();
$b1 = new B();
$a1->a();
$b1->a();
修饰符
public、private、protected、static和final。这些关键字是用来限定类成员(包括方法和变量)的访问权限。
public(公共成员)
- 在类的内部 可以使用
- 在类的外部 可以使用
- 在子类的内部 可以使用
<?php
class Per
{
public $name = "小龙";
public function fn()
{
// 1.可以在类的内部访问,对当前类的 内部可见
echo $this->name;
}
}
class Students extends Per
{
public function fn1()
{
// 2.可以在子类的内部访问,对子类的内部可见
$this->fn();
}
}
// 3.在类的外部可见
echo $s1->name;
$s1 = new Per();
// $s1->fn();//在类的内部访问
$s2 = new Students();
// $s2->fn1();//可以在子类的内部访问
private(私有成员)
1.在类的内部 可以使用
2.在子类的内部 不能使用
3.在类的外部 不能使用
class Book{
private $name='HTML';
public function setName($name){
// 1.在当前类内部 可访问
$this->name=$name;
echo $name;
}
public function getName(){
echo $this->name;
}
private function c1(){
echo '123';
}
}
class Histoty extends Book{
public function getBookName(){
// 2.在子类内部不可见 不可访问继承来的父类中的私有成员变量 私有方法
echo $this->name;
// $this->c1();
}
}
$b1=new Book;
// $b1->setName('测试');//在当前类内部 可访问
// 3.在类的外部不可访问 私有成员变量或私有成员方法
// echo $b1->name;//在类的外部 不能访问
// $b1->name='js';//在类的外部 不能使用
$h1=new Histoty();
$h1->getBookName();//在子类的内部 不能使用
protected(保护成员)
- 在类的内部 可以使用
- 在子类的内部 可以使用
- 在类的外部 不能使用
<?php
class Per{
protected $money=100000;
public function fn(){
echo $this->money;
// 1.在当前的内部可以访问
}
}
class Xs extends Per{
public function fn1(){
echo $this->money;
// 2. 可以在子类的内部访问
}
}
// 3. 在类的外部不能直接访问,
$p1=new Per();
// $p1->fn();//在类的内部 可以使用
// echo $p1->money;//在类的外部 不能使用
$s1=new Xs();
$s1->fn1();//在子类的内部 可以使用
final 关键字
<?php
// final 被修饰过的类是最终版本
class A{
public function aa(){
echo 'aa' ;
}
public function _construct(){
$this->aa();
}
}
final class B extends A{
public function aa(){
echo "bb";
}
// 被final 修饰过的方法 不能在子类中被重写
}
// 被final 修饰过的 类不能被继承
class C extends B{}
$c1= new C();
$c1->aa();
// $b1=new B();
// $b1->aa();//被final 修饰过的方法 不能在子类中被重写
静态成员(变量,方法)
不是所有的方法都要通过创建对象来去调用的,我们可以。通过给变量或者方法加上static关键字来直接调用。也叫做访问静态成员
<?php
class Book{
static $num=0;//声明一个静态变量$num,初始值为0;
public function showMe(){
echo '您是第'.self::$num.'位访客';
self::$num++;//
}
}
$b1=new Book();
$b1->showMe();
echo '一共有'.Book::$num.'位访客';