PHP 对象基础知识

最近开始重新学习对象知识,其实也算是初步深入学习对象和设计模式,希望自己会坚持下去,保持更新

初识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

posted @ 2018-10-18 23:19 itabel 阅读(...) 评论(...) 编辑 收藏