PHP 对象基础知识

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

相关文章
|
1月前
|
Java 程序员 PHP
PHP对象和类
PHP对象和类
18 0
|
6月前
|
SQL 安全 PHP
理解php对象注入
php对象注入是一个非常常见的漏洞,这个类型的漏洞虽然有些难以利用,但仍旧非常危险,为了理解这个漏洞,请读者具备基础的php知识。
php案例:自己写个数组转换成对象 对象转换成数组的的功能出来吧
php案例:自己写个数组转换成对象 对象转换成数组的的功能出来吧
php案例:自己写个数组转换成对象 对象转换成数组的的功能出来吧
|
3月前
|
JSON PHP 数据格式
|
9月前
|
存储 JSON PHP
在 PHP 中从 URL 获取 JSON 对象
在 PHP 中从 URL 获取 JSON 对象
|
9月前
|
JSON PHP 数据格式
php清洗数据实战案例(2):根据键值进行二维数据的对象数组的排序
php清洗数据实战案例(2):根据键值进行二维数据的对象数组的排序
55 0
|
9月前
|
定位技术 PHP
php基于百度地图封装的对象类实现计算地图上两点间的距离和地理编码
php基于百度地图封装的对象类实现计算地图上两点间的距离和地理编码
60 0
|
9月前
|
编解码 前端开发 JavaScript
layui框架实战案例(5):基于PHP后端的layUI上传视频到七牛云对象储存并自动转码
layui框架实战案例(5):基于PHP后端的layUI上传视频到七牛云对象储存并自动转码
196 0
|
9月前
|
PHP
PHP文件上传属性对象解读
PHP文件上传属性对象解读
42 0
|
10月前
|
存储 SQL 前端开发
PHP对象的引用及对象优化策略
当PHP5的出现面向对象思想,我们在构造PHP程序时候就有了对程序的新的总结,把对象特性封装到类,特别是当PHP框架应用到实际项目中,构造类的对象和调用类对象出现了很大的讲究。