一、面向对象基础
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