最近开始重新学习对象知识, 其实也算是初步深入学习对象和设计模式, 希望自己会坚持下去, 保持更新
初识 PHP 对象
还记得, 刚开始学习 PHP 的时候, 学到到方法和对象时有一个很大的疑问, 对象与方法相比较那么麻烦 (需要设置属性, 给属性赋值, 实例化类, 调用) 为什么还要用对象呢? 随着逐步的深入才发现, 自己之前的想法是有多可笑, 下面给一个简单的示例.
- function get_max($val_1, $val_2)
- {
- return $val_1> $val_2 ? $val_1 : $val_2;
- }
- $max = get_max(23,34);
- echo $max;
- echo '<br>====================== 这是华丽的分隔符 ======================<br>';
- // 类
- class Test
- {
- // 属性
- public $val_1;
- public $val_2;
- // 类的方法
- public function __construct($val_1, $val_2)
- {
- $this->val_1 = $val_1;
- $this->val_2 = $val_2;
- }
- public function get_max()
- {
- return $this->val_1> $this->val_2 ? $this->val_1 : $this->val_2;
- }
- }
- // 实例化类,$test 是由类 Test 生成的对象
- $test = new Test(83, 34);
- echo $test->get_max();
可以看到使用对象比单纯的方法多了很多代码, 但是为什么还要使用对象呢, 我们下一节详细介绍, 别走开, 往下看
为什么使用对象
什么是对象? 什么是类? 很多人会把两个搞混淆, 我们可以把类看做一个工厂, 产出的产品就是对象, 也就是对象是类的实现.
一个类通常包含属性, 方法. 举个: 有一个生产面包的机器 (类), 生成面包需要一些材料(属性), 材料包含面粉, 鸡蛋, 水(不熟悉). 有了材料就可以运作生成面包了, 这时机器会把准备好的材料放一起处理(方法) 生成面包.
关键字也是很重要的概念, 用来决定声明的属性或方法的可见性, 包含: public,protected,private. 一个属性或方法设置为 public 就代表无论在对象内还是对象外都可以被使用, 比如面包机里如果有一个搅拌机(仅限如果), 如果这个搅拌机设置为 public, 则这个搅拌机可以被任何品牌的面包机使用. 如果设置为 protected, 则只能在同品牌的面包机中使用(继承的类). 如果设置为 private 则只能被自己用.
回到上节问题, 对比方法, 问什么使用对象? 因为方便, 没错真的方便. 因为对象有以下几个特点:
封装性
继承
多态
封装性
封装: 顾名思义, 就是把类的属性和方法封装起来, 设置权限(public|protected|private), 如下:
- class Test
- {
- public $val_1;
- protected $val_2;
- public function __construct($val_1, $val_2)
- {
- $this->val_1 = $val_1;
- $this->val_2 = $val_2;
- }
- protected function get_max()
- {
- return $this->val_1> $this->val_2 ? $this->val_1 : $this->val_2;
- }
- }
- $test = new Test(83, 34);
- echo $test->get_max();
封装的好处是安全, 可控.
以上代码因为引用了 protected 声明的方法, 因此会报如下的错误
Fatal error: Uncaught Error: Call to protected method StudyDesignMode\Test::get_max() from context '' in ...
继承
同样顾名思义, 就是继承分类的方法或属性, 只能继承 public | protected 关键字声明的方法或属性. 继承的主要作用是多个不同的类都需要同样的一个方法, 可以使用继承. 比如多个网站页面 (每个页面都是单独的类) 都需要验证是否登录, 这时候可以定义一个父类, 里面验证是否登录, 再由需要验证登录的类继承, 这样就不需要每个类都写一次验证.
- class Test
- {
- private $val_1;
- private $val_2;
- protected function set_value($val_1, $val_2)
- {
- $this->val_1 = $val_1;
- $this->val_2 = $val_2;
- }
- protected function getMax()
- {
- return $this->val_1> $this->val_2 ? $this->val_1 : $this->val_2;
- }
- protected function getMin()
- {
- return $this->val_1> $this->val_2 ? $this->val_2 : $this->val_1;
- }
- }
- class TestSub extends Test
- {
- public function __construct($val_1, $val_2)
- {
- $this->set_value($val_1, $val_2);
- }
- // 简单功能测试
- public function printMaxValue()
- {
- echo $this->getMax();
- }
- public function printMinValue()
- {
- echo $this->getMin();
- }
- }
- $test = new TestSub(83, 34);
- echo '<br>====================== 这是华丽的分隔符 获取最大值 ======================<br>';
- echo $test->printMaxValue();
- echo '<br>====================== 这是华丽的分隔符 获取最小值 ======================<br>';
- echo $test->printMinValue();
结果:
====================== 这是华丽的分隔符 获取最大值 ======================
83
====================== 这是华丽的分隔符 获取最小值 ======================
34
多态
就是让具有继承关系的不同类对象重写类中的方法 (两个类中有相同名称的方法), 典型的应用是抽象类(abstract) 和接口类(interface). 如下:
- abstract class Vehicle
- {
- abstract public function run();
- }
- class Car extends Vehicle
- {
- public function run()
- {
- echo '速度 100';
- }
- }
- class Bicycle extends Vehicle
- {
- public function run()
- {
- echo '速度 15';
- }
- }
- $car = new Car();
- echo $car->run();
- echo '<br>====================== 这是华丽的分隔符 ======================<br>';
- $bicycle = new Bicycle();
- echo $bicycle->run();
结果:
速度 100
====================== 这是华丽的分隔符 ======================
速度 15
来源: https://www.cnblogs.com/it-abel/p/9813877.html