入门PHP就来我这(纯干货)08

~~~~ 有胆量你就来跟着路老师卷起来! -- 纯干货,技术知识分享 ~~~~
路老师给大家分享PHP语言的知识了,旨在想让大家入门PHP,并深入了解PHP语言。

 1 PHP对象的高级应用

1.1 final关键字

final 最终的、最后的。被final修饰过的类和方法就是“最终的版本”。被修饰的类不可以被继承,也不能有子类。被修饰的方法不可以被重写,也不可以被覆盖。

<?php 
   /***
    * 定义抽象类Book
    */
    final class Book{
        const NAME= 'computer';//定义常量NAME
        /**
         * 定义构造方法
         */
        function __construct(){
            echo "本年度图书类冠军为:".Book::NAME."<br>";
        }
    }
    class BookRank extends Book{
        const NAME = 'foreign language';
        function __construct(){
            parent::__construct();
            echo '本月图书类冠军为:'.self::NAME.'';
        }
    }
    $obj = new BookRank();

?>

会出现final无法被继承的异常信息: 

 1.2 抽象类

抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类使用abstract关键字来声明,格式如下:

//抽象类
abstract class AbstractName{
   //类体

   //抽象方法
   abstract function abstractFunctionName();
}

注意:

抽象类和普通类相似,包含成员变量、成员方法。两者的区别在于,抽象类至少包含一个抽象方法。

抽象方法没有方法体,其功能的实现只能在子类中完成。抽象方法也是使用abstract关键字来修饰的。在抽象方法后面要用分号结尾“;”。

抽象类和抽象方法主要应用于复杂的层次关系中,这种层次关系要求每一个子类都包含并重写某些特定的方法。

下面是商品抽象类及其子类的实现:

<?php 
   /***
    * 商品抽象类
    */
    abstract class CommodityObject{
        //抽象方法
        abstract function service($name,$price,$num);
    }

    class Books extends CommodityObject{
        function service($name,$price,$num){
            echo '商品是:'.$name.'---该商品的价格是:'.$price.'元';
            echo "<br>";
        }
    }
    class Computers extends CommodityObject{
        function service($name,$price,$num){
            echo '商品是:'.$name.'---该商品的价格是:'.$price.'元';
            echo "<br>";
        }
    }
    $books = new Books();
    $computers = new Computers();
    $books->service('PHP教程基础',30,5);
    $computers->service('戴尔计算机',5030,20);


?>

  1.3 接口使用

继承特性简化了对象、类的创建,增强了代码的可重用性。可是PHP只支持单继承。如果想实现多重继承,就要使用接口类。接口类通过interface关键字来声明,并且类中只能包含未实现的方法和一些成员变量,格式如下:

//接口类
interface InterfaceName{
    //接口方法
    function interfaceFunctionName1();
    function interfaceFunctionName2();

}

注意:不要用public以外的关键字来修饰接口中的类成员,对于方法,不写关键字也可以。这是由接口类自身的属性决定的。

子类是通过implements关键字来实现接口的,如果要实现多个接口,那么每个接口之间应使用逗号“,”连接,而且所有未实现的方法需要在子类中全部实现,否则将出现错误。

class SubClass implements InterfaceName1, InterfaceName2{

    function interfaceFunctionName1(){
         //功能实现
    }
    function interfaceFunctionName1(){
       //功能实现
    }
      //  ...

}

 会员和管理员权限案例:


<?php 

   /**
    * 职位
    */
   interface MPopedom{
    function popedom();
   }
   /**
    * 权限
    */
   interface MPurview{
    function purview();
   }

   class Member implements MPurview{
    function purview(){
        echo "会员全部权限";
    }
   }

   class Manager implements MPurview,MPopedom{
    function popedom(){
        echo "管理员-职位权限";

    }
    function purview(){
        echo "管理员-全部权限";
    }
   }
   $member = new Member();
   $manager = new Manager();
   $member->purview();
   echo "<br>";
   $manager->purview();
   echo "<br>";
   $manager->popedom();



?>

 

  1.4 对象类型检测

instanceof操作符可以检测当前对象是属于哪个类。一般格式如下:

ObjectName instanceof ClassName

<?php
  class SprotObject{}
  class Books extends SprotObject{
    private $type;
  }

  $c_book = new Books();
  if($c_book instanceof Books)
      echo '对象$c_book属于Books类<br>';
  if($c_book instanceof SprotObject)
      echo '对象¥c_book属于SportObject类<br>';

  ?>

 

  1.5 魔术方法(__)

PHP中有很多两个下划线开头的方法,比如构造方法__construct()方法,这些方法被称为魔术方法。当然不是他们真的会魔术,而是指在创建类的时候PHP自动包含的一些方法。

注意:PHP中保留了所有以"__"(双下划线)开头的方法,因此只能使用PHP文档中已经有的方法而不能创建。

1.5.1 __set()和__get()方法

__set()给变量赋值的方法,当程序试图写入一个未定义或者不可见的成员变量时,就会调用该方法。这个方法包含两个参数,第一个参数是变量名称,第二个参数是变量值,两个参数不能省略。

__get()方法是程序调用一个未定义或者不可见的成员变量时执行的,该方法参数只有一个就是被调用的变量名。

<?php
  class Student{
    private $a;
    private $b = 0;
    public $c;
    public $d = 0;

    public function __get($name){
      return 123;
    }

    public function __set($name, $value) {
      echo "这是 set 方法<br>";
    }
  }

  $s = new Student();
  echo "<pre>";
  var_dump($s->a);//输出int(123) 私有变量调用get方法返回123
  var_dump($s->b);//输出int(123) 私有变量调用get方法返回123
  var_dump($s->c);//输出NULL 公有变量未赋值 返回NULL
  var_dump($s->d);//输出int(0) 公有变量赋值了,返回赋值结果 0
  var_dump($s->e);//输出int(123) 未定义变量 和私有变量相同处理调用get方法返回 123
  $s->a = 3;//输出 这是 set 方法 私有变量调用set方法
  $s->c = 3;//已定义的公有变量不会调用get set方法,直接赋值
  $s->f = 3;//输出 这是 set 方法 未定义的f和私有变量输出相同
  
  ?>

注意:

1.公有变量可以直接调用和赋值,调用通过"->",赋值通过"="号,不会调用__get 和__set方法。比如$c和$d。

2.私有变量只能是类内部使用,因此调用和赋值的时候分别会调用__get 和__set方法。比如$a和$b。

3.未定义的变量按照私有变量处理。比如$e和$f。

1.5.2 __call()方法

当程序试图调用不存在或者不可见的成员方法时,PHP会先调用__call()方法来存储方法名及其参数。__call()方法包含两个参数,即方法名和方法参数(以数组形式存在)。

<?php
  class Exam{
    public function myDream(){
      echo '调用的方法myDream存在,直接执行此方法。<br><br>';
    }

    public function __call($method, $parameter){
      echo '方法不存在,执行__call方法。<br>';
      echo '方法名为:'.$method.'<br>';
      echo '参数有:';
      echo '<pre>';
      print_r($parameter);

    }
  }
  $exam = new Exam();
  $exam->myDream();//调用存在的方法
  $exam->myDream2('how','what','nb');//调用不存在的方法
  
  ?>

1.5.3 __toString()方法 

当使用echo或者print输出对象时,将对象转换成字符串。

<?php
  class Exam{
    private $type = 'EXAM';

    public function __toString(){
      return $this->type;

    }
  }
  $exam = new Exam();
  echo '对象$exam的值为:';
  echo $exam;

  
  ?>

1.5.4 spl_autoload_register方法  

通常使用include()函数或者require()函数在一个PHP文件中引入类文件。如在index.php文件中引入类A,代码如下:
 

<?php
  require('A.php');//引入类
  $a = new A();//实例化类A

?>

但是多数情况下程序中需要引入很多的类,就不能一个个利用require引入了,为了解决这个问题从PHP开始便引入了spl_autoload_register方法,该方法可以自动实例化需要使用的类,当程序需要用到一个类,但该类还没有被实例化,PHP7会使用spl_autoload_register方法在指定的路径下自动查找和该类名称相同的文件。如果找到,程序继续执行,否则报告错误。

下面例子实现spl_autoload_register自动加载

创建两个文件StudyObject.php和SportObject.php以及1个index.php,然后使用spl_autoload_register方法实现自动加载。

//index.php
<?php
  
function loadPrint($class_name) {
  $class_path = $class_name.'.php';
  if(file_exists($class_path)) {
    include_once($class_path);  //动态包含类文件
  } else {
    echo "类路径错误,文件可能不存在!";
  }
}
spl_autoload_register('loadPrint');


  $study = new StudyObject();
  
  echo $study->cont;
  echo '<br>';
  $str = "爱江山更爱美人!";
  $sport = new SportObject($str);
  echo $sport;

  
  ?>

 

<?php
  class SportObject{
    private $cont;
    public function __construct($cont){
        $this->cont=$cont;

    }
    public function __toString(){
        return $this->cont;
    }
  }

?>

 

<?php
 class StudyObject{
    private $cont;
    public function __get($name){
        return "江山代有才人出,各领风骚数百年!";

    }
 }
?>

下篇文章面向对象的应用。 


大家如果喜欢技术,并想有个好的交流平台可以关注我的 我的知乎首页,会不定期分享本人觉得比较好的技术类电子书。

另外,自己创建的一个技术qq群,玩转技术群,该群里功能:分享技能,电子书,代码,以及兼职项目等交流,欢迎大家加入一起交流。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/773813.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

固相提取铕和铀

固相萃取&#xff08;Solid Phase Extraction&#xff0c;SPE&#xff09;是一种常用的化学分离技术&#xff0c;它利用固体吸附剂&#xff08;固定相&#xff09;与样品中的目标化合物&#xff08;流动相&#xff09;之间的相互作用力&#xff0c;将目标化合物从样品中分离出来…

JVM的五大内存区域

JVM的五大内存区域 JVM内存区域最粗略的划分可以分为 堆 和 栈 &#xff0c;当然&#xff0c;按照虚拟机规范&#xff0c;可以划分为以下几个区域&#xff1a; JVM内存分为线程独享区和线程共享区&#xff0c; 其中 方法区 和 堆 是线程共享区&#xff0c; 虚拟机栈, 本地方法…

为什么需要做网络安全服务?

网络安全服务之所以重要&#xff0c;是因为它在保护数字资产、维护企业运营、确保法规遵从、防范恶意行为以及建立信任等方面扮演着关键角色。以下是一些主要的理由&#xff1a; 保护核心资产和数据&#xff1a; 数字化转型使得企业数据变得极其宝贵&#xff0c;包括知识产权、…

竞赛选题 协同过滤电影推荐系统

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

开发在线教育项目-在线课程视频网站开发

用了哪些技术 后端技术 springboot3 security权限框架&#xff08;后台&#xff09;mybatisPlus框架jwt生成tokeneasyexcel导入导出递归查询拦截器校验tokenredis的zset做排行榜功能redis的list做最新课程的功能redis做为缓存技术redis作为计数器&#xff0c;实时记录浏览量&…

极狐GitLab 将亮相2024空天信息大会暨数字地球生态峰会,携手中科星图赋能空天行业开发者

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

【Proteus】按键的实现『⒉种』

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

微信小程序毕业设计-走失人员的报备平台系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

【Python学习】流程控制、函数与类详解

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 Python作为一门强大而又简洁的编程语言&#xff0c;提供了丰富的工具和结构来帮助开发者编写清晰、高效的代码。在本文中…

企业搭建知识库:解锁无限潜力的钥匙

在当今这个信息爆炸的时代&#xff0c;企业如何高效地管理、传播与利用知识&#xff0c;已成为衡量其竞争力的重要标尺。知识库&#xff0c;作为这一背景下的产物&#xff0c;正逐步成为企业不可或缺的数字资产。它不仅是一个自助式的数字门户&#xff0c;更是连接员工、客户与…

加入AIGC的小艺还有这些大用处 快来看

说到毕业&#xff0c;有不舍、有迷茫也有期待&#xff0c;在这种复杂的情绪里&#xff0c;手机里的小艺&#xff0c;简直是贴心小棉袄&#xff0c;给了我很多依靠&#xff0c;让我能勇敢的往前走。 在离别时候有太多的不舍&#xff0c;想要写段寄语记录下来&#xff0c;这时候小…

记录AllWinner H700芯片 LCD屏幕显示不正常,有色块问题

现象&#xff1a; 修改后&#xff1a; 文档&#xff1a; 测试命令&#xff08;需要kernel打开 CONFIG_DEVMEMy&#xff09;&#xff1a; 读取&#xff1a; devmem2 $((0x6511000 0x0088)) w 写入&#xff1a; devmem2 $((0x6511000 0x0088)) w 0x7000000 代码&#xff1…

程序员自由创业周记#37:程序员创业的几个方向

程序员自由创业周记#37&#xff1a;程序员创业的几个方向 报志愿 这几天亲戚一外甥报志愿&#xff0c;让我推荐&#xff0c;我基于自己的认知觉得还是计算机相关是第一优选&#xff0c;即便现在各大互联网公司都过得不怎么好&#xff0c;裁员的消息此起彼伏&#xff0c;很多计…

从零到一:eBay自养号测评全流程解析与实操建议

eBay自养号测评是一种通过模拟真实买家行为&#xff0c;为卖家提供市场反馈并提升店铺权重和排名的技术手段。以下是进行eBay自养号测评的具体步骤和注意事项&#xff1a; 一、准备阶段 1. 技术配置&#xff1a;搭建境外服务器&#xff1a;选择稳定的境外服务器&#xff0c;模…

内网学习第6天 liunx定时任务 环境变量和权限配置,以及数据库提权

内网学习的第5天呢&#xff1f;&#xff1f;我就没有写&#xff0c;那个主要就是利用内核漏洞以及suid&#xff0c;来进行提权的。 我在虚拟机上面进行提权&#xff0c;我没有成功&#xff0c;我本地的虚拟机呢&#xff0c;扫出来的漏洞poc也没有让我提权成功。所以我就没有写…

知识图谱构建助手安装配置使用!Sapphire Ventures最全Sales AI图谱:AI如何重塑销售行业?

知识图谱构建助手安装配置使用!Sapphire Ventures最全Sales AI图谱:AI如何重塑销售行业? 项目简介 llmgraph 使您能够从给定的源实体维基百科页面创建 GraphML、GEXF 和 HTML 格式(通过 pyvis 生成)的知识图。知识图谱是通过从 ChatGPT 或 LiteLLM 支持的其他大型语言模型…

从零开始开发跑腿配送系统:技术选型与架构设计

开发一个跑腿配送系统涉及多个技术栈和模块&#xff0c;从前端到后端&#xff0c;再到数据库和实时通信&#xff0c;每一个环节都至关重要。本文将详细介绍从零开始开发跑腿配送系统的技术选型与架构设计&#xff0c;并提供部分代码示例以帮助理解。 一、技术选型 前端技术&am…

视频号矩阵源码:构建短视频生态的基石

在数字化时代&#xff0c;视频内容已成为连接品牌与消费者的重要桥梁。视频号矩阵源码&#xff0c;作为短视频营销自动化的创新引擎&#xff0c;正在帮助内容创作者和营销团队以前所未有的效率和智能&#xff0c;管理和扩展他们的视频内容。本文将深入探讨视频号矩阵源码的核心…

13-错误-ERROR: duplicate key value violates unique constraint “ux_xxx“

13-错误-ERROR: duplicate key value violates unique constraint “ux_xxx” 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯…

代谢组数据分析(十二):岭回归、Lasso回归、弹性网络回归构建预测模型

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2介绍 在代谢物预测模型的构建中,我们采用了三种主流的回归分析方法:岭回归、Lasso回归以及弹性网络回归。这三种方法各有其独特的原理和适用场景,因此在…