最近开始重新学习对象知识,其实也算是初步深入学习对象和设计模式,希望自己会坚持下去,保持更新
初识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 StudyDesignModeTest::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