面向对象(OOP)

简介: 面向对象编程 是一种编程思想,相对于过程式编程(步骤式的编程),OOP思想编程的代码更简洁、更易于维护,并且具有更强的可重用性。

相关概念

术语 说明
类(class) 具有相同特征和行为的对象
对象(obj) 具有特征和行为的个体
特征 属性,也就是变量
行为 方法,也就是函数

类的语法

/**
 *实例:类的书写格式以及实例化(创建对象)
 */
class Name{//不需要写括号 ,命名的每个单词首字母大写
      public a;   //属性
      funtcion A(){  //方法
      }
}
#类的实例化,结果是对象
$obj= new Name();  //返回对象
var_dump($obj);

访问对象

使用特殊操作符”->”访问对象的成员 ,对象里面的所有的成员都要用对象来调用,包括对象的内部成员之间的调用,PHP 提供了一个本对象的引用$this

外部访问: 对象->成员
内部访问: $this->成员
/**
 *实例:访问对象中的成员(属性和方法)
 */
class Human{
    public $name;
    public $sex;
    public $age;
    function self(){
        echo "我是{$this->name},性别:{$this->sex},{$this->age}岁";
    }
}
#实例化对象
$xiaoming=new Human();
#给属性赋值
$xiaoming->name ='小明';
$xiaoming->sex='男';
$xiaoming->age='23';
#访问属性
echo $xiaoming->name;  
#访问方法 
$xiaoming->self();

常量成员

不会在类中改变的值。使用关键字const声明类的常量,注意不能在方法里声明,只能在方法内部访问。

外部访问: 类名或对象::常量名
内部访问: self::常量名
/**
 * 实例:定义和访问类常量
 */
class ClassName{
    const NAME='value'; //定义一个常量
    function abc(){
        echo self::NAME; //方法内部调用常量
    }
}
$obj=new ClassName();   //实例化
$obj->abc();  //调用类的abc方法
echo $obj::NAME;  //使用对象名外部调用
echo ClassName::NAME;   //直接使用类名外部调用

静态成员

使用static 关键字声明属性,也可以声明方法,使用了静态,有以下特点

  • 静态成员可以不实例化类而直接访问
  • $this 在静态方法中不可用
  • 静态属性不可以由对象通过 -> 操作符来访问
  • 静态属性和静态方法的访问与常量的访问方式相同
  • 静态的成员属于类所有,可以在方法里声明静态属性,但不能直接调用
外部访问: 类名或对象::静态属性名或方法名
内部访问: self::静态属性名
/**
 *实例:静态属性与方法的声明和访问
 */
class ClassName{
    static $name='value';
    static function abc(){
        echo self::$name;
    }
}
$obj=new ClassName();
#访问静态属性
echo $obj::$name;   //实例化访问  
echo ClassName::$name;   //不实例化访问
#访问静态方法
echo $obj::abc();   //实例化访问  
echo ClassName::abc();   //实例化访问

构造函数

在类实例化后立即自动调用执行。一般初始化某些属性,或执行某些方法的函数。

/**
 *应用实例
 */
class Human{
    public $name;
    public $sex;
    public $age;
    function __construct($name,$sex,$age=0){
        $this->name=$name;
        $this->sex=$sex;
        $this->age=$age;
    }
    function self(){
        echo "我是{$this->name},性别:{$this->sex},{$this->age}岁";
    }
}
$xiaoming=new Human('小明','男',16);
$xiaoming->self();
$xiaoqiang=new Human('小强','男');
$xiaoqiang->self();

析构函数

php5中引入了析构函数。在类销毁之前自动执行,一般应用于重置、超出限制等场景。

/**
 *应用实例   
 *思考: 为什么小强比小明先消失?
 *原因:与内存存储有关,先声明的后销毁
 */
class Human{
    public $name;
    function __construct($name=''){
        $this->name=$name;
    }
    function self(){
        echo "我是{$this->name}<br>";
    }
    function __destruct(){
        echo "{$this->name}消失<br>";
    }
}
$xiaoming=new Human('小明');
$xiaoming->self();
$xiaoqiang=new Human('小强');
$xiaoqiang->self();

OOP特点

继承

继承是指在一个类的基础上再建立另一个新的派生类,新的派生类成为子类,继承了父类的所有类成员,并且可以重新定义或加进新的属性和方法, 提高了代码重用性。

  • 在PHP中,类继承通过 extends 关键字实现
  • 继承自其他类的类称为子类(child class 或 subclass)
  • 子类所继承的类称为父类( parent class) 或 基类 (base class)
  • 父类可以被多个子类所继承
  • 子类方法与父类方法同名时,子类方法覆盖父类方法,若要父类方法不被覆,则使用 paren关键字 格式 :paren::testA();
/**
 * 实例:定义 Test 类,并继承自 TestParent 类
 */ 
class TestA {
    public $testA1;
    function testAFun(){
        echo "我是父类的方法和{$this->testA1}";
    }
}

Class TestB extends TestA {
    public $testB1;    
    function testBFun(){
        paren::testAFun();
        echo '我是子类的方法和{$this->testB1}';
    }
}
#访问、设置继承父类的方法和属性
$obj=new TestB ();
$obj->testA1='属性';
$obj->testBFun();

封装

封装是指使用修饰符对属性和方法进行限制,尽可能隐蔽对象的内部细节。对外形成一个边界,只保留有限的对外接口使之与外部发生联系。类的封装性具有以下优点

  • 隐藏类的实现细节,让使用者只能通过事先定义好的方法来访问数据。
  • 可以方便的加入逻辑控制,进行数据检查,限制对属性的不合理操作
  • 便于修改增强代码的可维护性

访问修饰符是指允许开发人员对类成员的访问进行限制,这是PHP5的新特性。

修饰符 说明 作用域
public 公共修饰符 没有访问限制
private 私有修饰符 只有本类没有访问限制,子类也无权限访问
protected 保护修饰符 只有本类、子类没有访问限制,被子类继承的protected成员,在子类外部同样不能被访问
/**
 * 实例:类的封装,本例子的属性需要逐个测试
 */ 
class TestA {
    public    $test1;   //公共
    private   $test2;   //私有
    protected $test3;   //保护
    function __construct($test1){
        $this->test1=$test1;
        $this->test2=$test2;
        $this->test3=$test3;
    }
    function testFun1(){
        echo "我是父类的方法和{$this->$test1}";
    }
}
Class TestB extends TestA { 
    function testFun(){
        echo "我是子类的方法和{$this->test1}";
    }
}

$objA=new TestA('TEST1');
$objA->testFun1();
#访问、设置继承父类的方法和属性
$objB=new TestB('TEST1');
$objB->testFun();

多态

多态性是指在父类的属性或行为被子类继承之后,可以具有不同的数据类型或表现出不同的行为。使用一个函数封装具有相同方法的对象,通过设置函数的参数约束。

class TestA{
    public $test1;   //公共
    function __construct($test1){
        $this->test1=$test1;
    }
    function testA1(){
        echo "父类A1方法调用的属性值:{$this->test1}";
    }
}
Class TestB extends TestA { 
    function testB1(){
        echo "子类的方法调用的属性值:{$this->test1}";
    }
}

#使用同个函数封装具有相同类成员的不同对象
function test($obj){
    $obj->testA1();
    $obj->testB1();
}

$obj=new TestB('哈哈');
test($obj);

#可以增加父类或祖先类的约束(PHP使用少)
Class TestC {   
    public $test1;   //公共
    function __construct($test1){
        $this->test1=$test1;
    }
    function testA1(){
        echo "父类A1方法调用的属性值:{$this->test1}";
    }
    function testB1(){
        echo "子类的方法调用的属性值:{$this->test1}";
    }
}
function test(TestA $obj){
    $obj->testA1();
    $obj->testB1();
}
$obj=new TestB('哈哈');  //正确实例
/*$obj=new TestC('哈哈');//错误实例*/
test($obj);

命名空间

PHP5.3新加的特性,为了避免产生类名冲突而产生的。

  • 命名空间采用namespace来声明,并且namespace之前不能有输出
  • 在如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。
  • 有三种类型的代码受命名空间的影响,它们是:函数常量
  • 不提倡在同一个文件中定义多个命名空间
  • use 别名使用
/**
 *实例:命名空间(待验证)
 */
#建立wengdo.php 代码如下:
namespace wengdo; //定义了一个名字空间
    function time(){
        return "wengdo里面的time函数";
    }
    const PHP_OS='wengdo里面的常量';
    class Test{
        public function __construct(){
        echo 'wengdo里面的Test类';
    }
}

#建立tests.php 代码如下:
include('wengdo.php');
echo time(); //非限定名称
echo "<br />";
echo wengdo\time(); //限定名称
echo "<br />";
echo \wengdo\time(); //完全限定名称

$p1=new wengdo\Test();
use wengdo as hehe;   //使用别名
$p1=new hehe\Test();

自动加载

通常一个类都以有规律的命名保存为一个PHP文件,当PHP文件中需要调用一个类时,通过include把这个文件引入。当需要引入多个类文件时,很繁琐,PHP5提供了一个__autoload()来解决这个问题。

在组织定义类的文件名时,需要按照一定的规则,文件名与类名保持一致,加上统一的前缀或后缀形成文件名,如:

  • class_db.php
  • Abc_class.php
  • Abc.class.php
/**
 *实例: 自动加载文件class_name中的类(待验证)
 */
function __autoload($class_name)  { 
    include("$class_name"."_class.php"); 
} 
#实例化对象时,如果类不存在,则调用__autoload()函数,其参数为类名
$db = new employee ();
目录
相关文章
|
4月前
|
人工智能 安全 算法
从“工具过载”到“精准调用”:破解 Agent 工具管理难题
AgentScope Java × Higress:语义驱动工具精选,高效安全降成本。
503 40
|
SQL 前端开发 搜索推荐
【Element-UI】实现动态树、数据表格及分页效果
在现代软件开发中,动态树、数据表格以及分页效果成为了许多应用的核心需求。随着业务规模和复杂性的增加,我们往往需要展示大量的层级结构数据,并且实现交互性强且高效的操作。 动态树提供了一种组织结构清晰、可伸缩的展示方式,使用户可以方便地查看和操作树节点。数据表格则是以表格形式呈现数据,在其中用户可以进行排序、筛选、编辑等操作。 而分页效果则能够将大量数据分割成易于管理和浏览的一页或一页的内容。这三种功能的结合,不仅使得我们能够更好地处理庞大的数据集合,同时也使得用户能够快速定位所需信息。 本文将介绍如何使用现代前端技术实现动态树、数据表格及分页
|
12月前
|
存储 Linux 虚拟化
Dell OpenManage Enterprise 4 初始化配置
Dell OpenManage Enterprise 4 初始化配置
315 6
Dell OpenManage Enterprise 4 初始化配置
|
4月前
|
人工智能 IDE 安全
牛,AI 写代码进入“编排时代”:Vibe Kanban 让多个 Agent 并行干活~~~
小华同学推荐高效AI编程工具Vibe Kanban:支持多Agent并行开发、Git隔离安全运行,可视化Code Review,本地部署不外传代码。集成Claude、Codex等主流模型,配合看板式任务管理,提升开发效率50%以上,10万+开发者已订阅!
959 1
|
4月前
|
人工智能 算法 测试技术
全网最完整 GEO 优化落地指南(万字实操版)
GEO是让AI在回答时主动推荐品牌的优化策略。品牌若不被推荐,常因内容未被AI抓取、缺乏信任或未切中用户问题。企业可通过诊断现状、优化结构化内容、精准分发与持续监测五步法系统实施。B2B企业借此能在采购全链路中高效触达客户,短期即可提升AI提及率与销售转化。这将是伴随AI搜索发展的长期趋势,值得尽早布局。
4717 13
|
机器学习/深度学习 人工智能 算法
阿里云人工智能平台图像视频特征提取
本文介绍了图像与视频特征提取技术在人工智能和计算机视觉中的应用,涵盖图像质量评分、人脸属性分析、年龄分析、图像多标签打标、图文视频动态分类打标、视频质量评分及视频分类打标。通过深度学习模型如CNN和RNN,这些技术能从海量数据中挖掘有价值信息,为图像分类、目标检测、视频推荐等场景提供支持,提升分析精度与效率。
959 9
|
JSON 人工智能 算法
探索LLM推理全阶段的JSON格式输出限制方法
文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
3331 52
|
存储 自然语言处理 监控
ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案
ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案
523 0
|
弹性计算 关系型数据库 OLAP
快速上手并跑通AnalyticDB PostgreSQL版TPC-H测试
本案例介绍如何创建AnalyticDB PostgreSQL实例、生成测试数据、建表、导入数据,并跑通TPC-H查询。