PHP面向对象基础

PHP面向对象基础

一、引入

面向对象的编程的基本构成便是“过程”,过程实现的方式就是“函数”,我们通过不同函数来实现不同的功能,并按照程序的执行顺序调用相应的函数,组成一个完整的可以运行的应用程序,我们可以通过把不同的功能在不同的函数中实现或者给函数传递不同的参数来实现不同的功能,这是面向过程中模块化设计的原理。

但是面向过程有很多问题,当我们总是按照教科书上的小例子来学习程序设计时是永远也体会不到面向过程中存在的这些问题的,反而会觉得面向过程更简单,更容易理解。而事实是当我们设计一些大型的应用的时候将会发现使用面向过程编程是多么的痛苦和无奈,代码极难维护,我们不得不为相似功能设计不同的函数,天长日久,代码是越来越大,函数越来越多,而重复的代码越来越多,噩梦就此产生。

于是产生了另外一种程序设计思想:面向对象,从此程序员发现编程是多么快乐的一件事情,我们可以把现实世界的很多哲学思想或者模型应用于编程,这是计算机的一次伟大的革命。那么究竟何为面向对象?

基于PHP来进行通用的面向对象的编程和演示,进而对其他编程语言(如Java、Python、C#、C++等)进行举一反三。

二、什么是面向对象

image-20240229153240129

OOP (Object-Orientied Programming):将现实世界的各类物体 特性 和 行为 用编程语言进行抽象表达,具备比面向过程更加高级的特性

1.何为类

class 类就是一类东西,一类事物的统称,比如“门”是一类东西,“防盗门” “汽车门” 也是一类东西,“人” “男人” “女人” 等,因为同类有相同的特性和行为。

门的特性:材料,高度,宽度,样式,颜色…

门的行为:打开,关闭,上锁…

2.何为实例

instance 实例就是明确告知哪一类东西的哪一个,比如“小明家的入户门”,或者“车牌为A12345的汽车的左前门”就属于一个实例。

3.何为对象

在面向对象的程序设计中,"一切皆对象”(对面向对象理解得有多深取决于对这句话的理解有多深)。一个类是一个对象,一个实例是一个对象,一个变量也是一个对象,甚至一个数据类型,也都可以视为一个对象。

4.对象有什么特征

对象不同于过程的最基本的特征有两点:

  • 对象有方法:比如门可以“开",可以“关”,可以“锁”,这些属于方法,也称为对象的行为。
  • 对象有属性:比如门有“宽度”,“高度”,“厚度”,“重量”等,这些属于属性,或称为特征。

对于属性,这在面向过程中是类似于变量,而对于方法,方法本身来说就是一段处理程序,方法与面向过程的函数其实是类似的(方法和函数都由一段代码组成,可以包括参数,可以有返回值或没有返回值),它们之间唯一的区别在于函数是不存在公有私有一说的,而方法却有访问修饰符(public,private,protected等),这种类型修饰符直接决定了该方法能不能被别的子对象便用。

5.何为子对象呢

这里牵涉着面向对象另一个非常重要的特性:继承,简单理解继承就是“子承父业”,与生物学上的继承,遗传的概念没有区别。就拿人类来说,父亲有的方法(如走,跑,跳,吃,睡等)同样儿子也可以有,儿子还可以自创一个自己的方法(如射击,冲浪,骑车)。

6.多态

现实生活中还有一个很有趣的现象是:父亲是儿子的父亲,同样父亲也是爷爷的儿子,所以父亲这个对象它有时候也是儿子,那么还有可能是丈夫………,这表示一个对象可以有多种形态,这就是“多态”

关于面向对象的基本概念在此总结如下:

  • 世间万物皆为对象
  • 类表示一类事物
  • 实例表明类的真实存在
  • 对象有方法和属性
  • 对象可以被继承
  • 对象有多种形态

四、封装、继承、多态

1.封装

<?php

/**
 * 封装:public private protected
 * 1.默认情况下,所有属性和方法,在没有明确设置访问修饰符时,均为public
 * 2.private 表示类私有,被定义的属性只有在类的定义代码中才可以使用,类的实例和子类中均无法使用
 * 3.protected 表示受类的保护,示例中不能直接使用,但是在子类中可以使用
 */
class people{
    // 在类中,这些东西叫做属性
    // 定义类时,可以给属性设置一个初始值
    // 使用了访问修饰符后,就不再需要 var 
    private $name = 'ymq';
    var $age = '';
    var $addr = '';
    var $nation = '';

// 定义People类所具有的方法,默认情况下,方法的定义与函数完全一致
    function talk() {
        echo "$this->name 正在说话 他的年龄才 $this->age 岁<br>";
    }
    protected function work() {
        echo "$this->name 正在工作 他的年龄才 $this->age 岁<br>";
    }
    // 设置公有方法调用私有方法
    function eat($type='长寿面') {
        echo "$this->name 正在吃 $type <br>";
        $this->work();
    }
    // 针对私有属性,如何在示例中对其进行修改?
    // 设置公有方法操作私有属性
    function changename($name) {
        $this->name = $name;
    }
    function getname() {
        return $this->name;
    }
}

$p1 = new people();
// $p1->name = 'ymqyyds';  //实力无法使用类的私有属性
$p1->age = 20;
$p1->talk();
$p1->changename("ymqyyds");
echo $p1->getname()."<br>";
$p1->eat();

?>

2.继承

class Man extends People {
    // 什么都不做可直接使用People的所有非私有方法和属性
    var $name;
    var $phone = '';
    // 父类的方法在子类中可以覆盖,也称为,重写 override
    function talk() {
        echo "$this->name 正在说话 <br>";
    }
    function eat($type='长寿面') {
        echo "$this->name 正在吃 $type <br>";
        parent::work();
    }

    function callphone() {
        echo "请打电话给1377281626 <br>";
    }
}
/**子类调用属性和方法,如果没有重写,那么首先调用父类的,如果子类有重写,那么就调用子类重写的 */

$m = new Man();
// 其实子类也可以直接定义一个父类定义过的属性并使用
// $m->name = 'wcnb';
// echo $m->name."<br>";

$m->talk(); // 不重写时,父亲 ...
$m->eat();  // 不重写时,父亲 ...
// 以上调用类的方法时,如果子类没有重写父类的方法,那么调用的结果还是父类方法的结果,如果重写了,那么久调用的是 子类的方法 

// 通过下面修改类姓名的方式才得以修改子类的属性,然后再调用父类的方法,结果就和父类不一样了
// $m->changename('儿子');
// echo $m->getname()."<br>";  // 儿子
$m->name = '儿子'; // 也可以直接给子类属性赋值
$m->talk();  //儿子 正在...
$m->eat();  //儿子正在吃,父亲正在工作 eat的是子类方法,work的是父类方法

3.多态

针对弱类型编程语言,多态并不是特别的标准,多态在强类型编程语言(Java,C#,C++),多态是非常重要。弱类型编程语言的面向对象的多态,效果不是很明显,在强类型语言中,多态就是面向对象的灵魂

/**多态:多种形态 */
// 抽象类:只要类的方法中有一个方法使用 abstract 关键字定义,则该类就是抽象类,该方法就是抽象方法
// 抽象类的特点:不能被实例化,只能被继承,抽象方法不能有实现代码(不能有函数体)
abstract class animal{
    // function can() {
    //     echo "this function will be rewrited in the children <br>";
    // }
    abstract function can(); // 抽象方法必须被子类实现,且父类不能有实现的代码

}
class cat extends animal{
    function can(){
        echo "i can climb <br>";
    }

}
class dog extends animal{
    function can() {
        echo "i can swim <br>";
    }

}
function test($obj){
    $obj->can();
}
test(new cat());
test(new dog());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值