一、面向对象基础

1. OOP目标

  • 重用性:重复被使用
  • 灵活性:容易被替换
  • 扩展性:方便增加新功能

2.OOP简介

1)类(Class) 与 对象(Object)

理解这句话:类是对象的模板,对象是类的实现。

// 定义类
class Computer
{ }
// 实例类
$computer = new Computer();
var_dump($computer);
// 输出结果:$computer 是类 Computer 的一个对象。
object(Computer)#1 (0) {}

2)类的属性与方法

访问控制

  • public: 共有的,类的属性与方法可以被任意调用
  • private: 私有的,类的属性与方法只能在类的内部使用
  • protected: 受保护的,类的属性与方法可以被自身以及与自身处于继承关系的其他类使用

类的属性调用

class Computer
{
    public $cpu = 'i7';
    public $mainboard = '华硕';
    private $hd = 1024;
}
$computer = new Computer();
var_dump($computer);
// 输出结果:很直观的可以看到每个属性的访问,以及访问控制
object(Computer)#1 (3) {
  ["cpu"]=>
  string(2) "i7"
  ["mainboard"]=>
  string(6) "华硕"
  ["hd":"Computer":private]=>
  int(1024)
}
var_dump($computer->cpu);
// 输出结果:string(2) "i7"
var_dump($computer->mainboard);
// 输出结果:string(6) "华硕"
var_dump($computer->hd);
// 输出结果:hd 为私有属性,不能调用
Fatal error: Uncaught Error: Cannot access private property Computer::$hd

类的方法调用

class Computer
{
    public $cpu = 'i7';
    public $mainboard = '华硕';
    private $hd = 1024;
		// 公共方法:玩游戏,其中调用内部方法 job,$this 代表当前实例
    public function game($gameName = '马里奥')
    {
        $this->job($gameName);
    }
		// 公共方法:执行任务
    public function job($jobName)
    {
        echo $jobName . PHP_EOL;
    }
}
$computer = new Computer();
$computer->game('超级玛丽');
// 输出结果:超级玛丽

注意:类的方法如果需要调用其他属性使用 $this 表示类的当前实例来调用方法

类的私有方法调用,丰富一下当前类

class Computer
{
    public $cpu = 'i7';
    public $mainboard = '华硕';
    private $hd = 1024;

    public function game($gameName = '马里奥')
    {
        // 调用私有方法,判断游戏是否可以玩,如果不能玩,输出结果
        if ($this->getHdSize() <= 1024) {
            $this->job('内存太小,不能玩');
            return;
        }
        // 达到内存要求可以继续玩
        $this->job($gameName);
    }

    public function job($jobName)
    {
        echo $jobName . PHP_EOL;
    }

    private function getHdSize()
    {
        return $this->hd;
    }
}
$computer = new Computer();
$computer->game('超级玛丽');
// 输出结果:内存太小,不能玩
$computer->getHdSize();
// 输出结果:私用方法不能被外部调用,可以被类内部调用
Fatal error: Uncaught Error: Call to private method Computer::getHdSize() from context ''

3) 类常量

类的常量使用 const 来定义,并且不能被修改

明白 $this 与 self 区别

$this 在类的代码中代表当前类的实例;

self 在类的内部代码中代表当前类本身,在后面的类的常量/类的静态属性以及类的静态方法都是使用 self:: 来调用

class Computer
{
    const MAC = 'MAC地址';
    const NO = '出厂编码';
    const ONE = 1;
    const TWO = self::ONE + 1;
    const THREE = self::TWO + 1;
}

// 调用类的常量
echo Computer::TWO;
// 输出结果: 2
Last Updated: 8/7/2019, 5:33:53 PM