• 技术文章 >后端开发 >php教程

    归纳总结PHP对象基础

    长期闲置长期闲置2022-03-09 18:11:59转载287
    本篇文章给大家带来了关于PHP中的相关知识,其中主要介绍了面向对象的相关问题,面向对象编程的本质是增加数据和功能的操作主体即对象,希望对大家有帮助。

    推荐学习:《PHP教程

    实践学习php,thinkphp,Redis,vue,uni-app等技术,推荐开源电商系统likeshop,可以借鉴思路,可去版权免费商用,gitee下载地址:
    点击进项目地址

    面向对象:OOP(objected oriented programming)编程

    面向过程是一种编程思想

    面向对象编程的本质是增加数据和功能的操作主体,即对象

    面向对象中的所有的数据和功能多是由主体(对象)来调用和操作

    面向对象基础

    面向过程和面向对象区别

    image-20210130153514844

    面向对象关键字

    创建对象

    <?phpclass People{}$man=new People();# 实例化类,man就是对象var_dump($man);?>
        # 输出object(People)#1 (0) { }
        #1表示:对象编号,与类无关,是整个脚本中对象的序号(0)表示:成员变量(属性)个数{}表示:具体成员变量信息(键值对)

    类对象

    <?phpclass Buyer{
        # 常量声明
        const BIG_NAME='BUYER';
        # 常量不需要加 $
    
        # 属性声明
        # $name;
        # 错误的,类内部属性必须使用访问修饰限定符
        public $name;
        public $money=0;
        
        # 方法声明
        function display(){
            echo __CLASS__;
            # 魔术常量,输出类名
            # 方法内部变量属于局部变量
        }}# 实例化$a = new Buyer();# 属性操作,增删改查echo $a->money;$a->money='20';$a->sex='male';unset($a->name);echo '<br>';# 方法操作$a->display();echo '<br>';var_dump($a);?>
        # 输出0Buyerobject(Buyer)#1 (2) { ["money"]=> string(2) "20" ["sex"]=> string(4) "male" }

    注意:类常量不是由对象来进行访问

    访问修饰限定符

    在属性或者方法前的修饰关键字,用来控制属性或者方法的访问位置

    属性必须有访问修饰限定符,方法可以没有访问修饰限定符,默认就是 public

    类内部对象

    $this,方法内部内置的一个对象,会自动指向来调用的方法的对象

    $this 存在于方法内部(仅限内部使用),所以相当于在类的结构内部

    <?phpclass Article{
        protected $name = 'a';
        private $type = 'art';
    
        public function get_name()
        {
            var_dump($this);
        }}$a = new Article();var_dump($a);?>
        # 输出object(Article)#1 (2) { ["name:protected"]=> string(1) "a" ["type:private"]=> string(3) "art" }

    $this 代表的是对象,而 $this 所在环境为类内部的方法内部,所以 $this 对象是在类内部访问,因此所有的属性和方法,不受访问修饰限定符限制

    image-20210201090314602

    image-20210201090809302

    image-20210201095446499

    构造方法

    <?phpclass Article{
        public $name='xiaoli';
        private $sex="male";
    
        public function __construct($name,$sex)
        {
            $this->name = $name;
            $this->sex = $sex;
        }}$a = new Article('xiaowang', 'famale');var_dump($a);?>

    析构方法

    <?phpclass Article{
        protected $name = 'xiaoli';
        private $sex = 'famale';
    
        public function __destruct()
        {
            // TODO: Implement __destruct() method.
            echo __FUNCTION__;
        }}$a=new Article();# 销毁对象$a=1;unset($a);# __destructendecho 'end';?>
        # 不销毁对象,php在运行结束也会释放资源# end__destruct

    对象传值

    定义:将保存对象的变量赋值给另外一个变量

    在 PHP 中,对象的传值是引用传递:即一个对象变量赋值给另外一个变量,两个变量指向同一个对象地址,即只有一个对象

    <?phpclass Article{
        public $name = 'xiaoli';
        public $sex = 'famale';}$a=new Article();$b=$a;var_dump($a,$b);echo '<br>';$a->name="wangxiaohu";var_dump($a,$b);echo '<br>';?>
        # 输出object(Article)#1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" } object(Article)
        #1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" }object(Article)
        #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" } object(Article)
        #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" }

    范围解析操作符(类常量访问)

    有两个冒号组成 “::” ,专门用于类实现类成员操作,可以实现类直接访问类成员

    <?phpclass Article{
        const  NAME='ocean';}echo Article::NAME;
        # 常量是不能通过 Article->NAME 来进行访问的$a=new Article();echo $a::NAME;
        # 范围解析操作符兼容对象,找到对象所属类最终进行访问,效率降低,灵活性提高?>

    类常量是固定的,而对象的属性是不同对象不同的

    image-20210201115041335

    静态成员

    定义:使用 static 关键字修饰的类成员,表示该成员属于类访问

    image-20210201133428850

    <?phpclass Article{
        public static $name = 'hlm';
        public static $type = 'art';
    
        public static function getName()
        {
            return self::$name;
        }}# 静态属性$a = new Article();echo Article::$name;# 静态方法echo Article::getName();?>

    self关键字

    <?phpclass Article{
        public static function getInstance1()
        {
            return new self();
        }
    
        public static function getInstance2()
        {
            return new Article();
        }}$a = Article::getInstance1();$b = Article::getInstance2();var_dump($a,$b);?>
        # 输出object(Article)
        #1 (0) { } object(Article)
        #2 (0) { }

    类加载

    类的访问必须保证类在内存中已经存在,所以需要再用类之前将类所在的 PHP 文件加载到内存中

    自动加载要求在声明类的时候有良好的规范

    image-20210201144541271

    例:手动加载

    image-20210201145934549

    Article.php

    <?phpclass Article{
        public function getName(){
            return __METHOD__;
        }}

    mian.php

    <?php# include 'Article.php';# 直接加载比较消耗资源,而且如果类已经在内存中存在,直接include会报错,建议判断后再加载if(!class_exists('Article')){
        include 'Article.php';}$a=new Article();var_dump($a->getName());
        # outputstring(16) "Article::getName"

    自动加载

    一个系统中,可能类文件会放到不同的路径下,因此一个完整的自动加载函数,应该要进行文件判定功能

    <?php
    function __autoload($classname){
        # 形参代指 类名
        #组织文件路径,假设当前路径下,有两个文件夹下都有类c和类m
        $c_file = 'c/' . $classname . '.php';
        if (file_exists($c_file)) {
            include_once($c_file);
            return true;
        } 
        //if 语句如果只有一行不需要加 {}
        //include_once 只加载一次
    
        $m_file = 'm/' . $classname . '.php';
        if (file_exists($m_file)) {
            include_once($m_file);
            return true;
        }
    }
    
    
    $a=new Article();
    $b=new Article();
    <?phpfunction autoload01($classname){
        if(!class_exists($classname)){
            $file_name=$classname.'.php';
            if(file_exists($file_name)) include_once $file_name;
        }}spl_autoload_register('autoload01');$a=new Article();

    对象克隆

    通过已有的对象复制一个新的同样的对象,但两者之间并非同一个对象

    image-20210201161635978

    image-20210201161616688

    面向对象高级

    面向对象三大特性

    封装、继承、多态

    类的封装

    image-20210201171024833

    类的继承

    inherit,子类合法拥有父类的某些权限

    子类也称派生类

    父类也称基类

    # 父类class Human{}# 子类继承class Man extends Human{}

    类的多态

    多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果

    image-20210201190338257

    —PHP继承—

    <?phpclass Human{
        public function show(){
            echo __METHOD__;
        }}class Man extends Human{}$m=new Man;$m->show();

    有限继承

    子类在继承父类的成员时,并非继承所有内容,而是继承并使用父类部分内容

    重写 Override

    override,子类中定义了与父类重名的成员

    image-20210202091754458

    parent 关键字

    一种明确访问父类成员的表达方式

    image-20210202092320773

    方法被重写后,访问调用的是子类方法,如果想要访问父类方法,可以通过在子类方法中使用 parent 来强制访问父类方法

    parent 不能用于访问父类的属性(静态属性可以)

    PHP 继承特点

    静态延迟绑定

    image-20210202093514060

    image-20210202093932752

    最终类 Final

    使用 final 关键字修饰类名,表示此类不可以被继承

    final 关键字还能修饰方法,表示方法不能被重写(通常此时类不会使用 final 关键字)

    image-20210202094929480

    抽象类 Abstract

    使用 abstract 关键字修饰的类,表示该类只能被继承,不能被实例化

    abstract 关键字可以修饰方法,表示方法为抽象方法,抽象方法没有方法体(没有{})

    抽象方法存在的类必须为抽象类

    继承抽象类的类要么为抽象类,要么实现抽象类里所有的抽象方法

    trait 代码复用

    image-20210203135531893

    适用于,不同类之间有公共代码,但是类彼此关系不存在继承关系,此时可以将公共代码存储到 trait 中

    trait 内部可以拥有一个类能拥有的成员属性(包括静态),成员方法(包括静态和抽象方法),但不能有类常量

    trait 用来代码复用,不能被实例化,不能被继承

    trait 同名

    一个类中可能需要引入多个 trait ,而不同 trait 中可能出现同名

    image-20210203141318530

    接口

    Interface,专门用来规范一些共性类必须实现的方法

    interface 接口名字{}

    class 类名 implements 接口名字{}

    image-20210203145047924

    接口成员

    接口成员只能有两类

    image-20210203145534966

    PHP 重载

    overload,指在一个类中可以出现多个同名方法,彼此之间的参数个数和类型不一样

    image-20210203190348714

    用来容错

    属性重载

    当对象访问不存在的或者权限不够的属性的时候,自动触发魔术方法让代码不出错

    属性重载魔术方法

    方法重载

    对象或者类访问不存在或者权限不够的方法,自动触发的魔术方法让代码不出错

    对象遍历

    将对象中的所有属性以键值对的形式取出并进行访问

    Iterator 迭代器

    image-20210204090552234

    生成器

    image-20210204092053300

    image-20210204091506575

    yield 关键字

    设计模式

    design pattern,是软件开发人员在软件开发过程中问题的解决方法

    单例模式

    singleton,是一种类的设计只会最多产生一个对象的设计思想image-20210204092904886

    保证资源唯一性

    工厂模式

    。。。。。。

    命名空间

    namespace,指人为的将内存进行分隔,让不同内存区域的同名结构共存,从而解决在大型项目能出现重名结构问题

    image-20210204095323759

    基础语法:

    namespace 关键字定义空间

    命名规则

    字母、数字、下划线,不能以数字开头

    命名空间必须写在所有代码之前,定义了一个,之后可以定义多个

    image-20210204100804279

    子空间

    subspace,即在已有空间之上,再在内部进行空间划分

    子空间直接通过 namespace+路径符号 \ 实现

    非限定名称

    直接访问元素本身,代表当前所属空间(当前目录)

    限定名称

    使用空间名+原名,代表访问当前空间子空间(当前目录子目录)

    完全限定名称

    从根目录(全局空间)开始访问,使用 \ 作为全局空间开始符号(根目录)

    全局空间元素访问:使用完全限定名称访问

    image-20210204140347426

    命名空间引入

    image-20210204141027952

    推荐学习:《PHP视频教程

    以上就是归纳总结PHP对象基础的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:CSDN,如有侵犯,请联系admin@php.cn删除
    专题推荐:PHP
    上一篇:浅析PHP配置文件中的几种超时配置 下一篇:聊聊nginx平滑重启和FPM平滑重启
    PHP编程就业班

    相关文章推荐

    • php中返回值是什么意思• php有字符串比较方法吗• 实例图文详解!thinkphp搭建后端api接口• php怎么进行字符串替换• php能不能写区块链

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网