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

news2024/11/20 15:33:05
~~~~ 有胆量你就来跟着路老师卷起来! -- 纯干货,技术知识分享 ~~~~
路老师给大家分享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.coloradmin.cn/o/1896007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在电脑设备上恢复已删除的照片

丢失 PC、智能手机或 USB 闪存盘上的照片可能会让人不知所措。幸运的是&#xff0c;使用最好的照片恢复软件&#xff0c;您可以在 Windows 和 Android 上恢复已删除的照片。本博客讨论如何使用照片恢复来恢复丢失的照片。 数码照片是我们记忆的重要组成部分。然而&#xff0c;它…

UE4_材质基础_切线空间与法线贴图

学习笔记&#xff0c;不喜勿喷&#xff0c;侵权立删&#xff0c;祝愿大家生活越来越好&#xff01; 一、切线空间 在《OpenGL基础11&#xff1a;空间》中提到了观察空间、裁剪空间、世界空间等。切线空间和它们一样&#xff0c;都属于坐标空间 上面就是一个…

FPGA的理解,个人的见解,不一定对

类似于面包板上搭建电路&#xff0c;但是使用的是逻辑单元模块&#xff1b;如加法器&#xff0c;减法器&#xff0c;寄存器等 没有模拟电路的电容&#xff0c;电阻&#xff1b;但是逻辑单元的底层实现&#xff0c;使用MOS管等电路实现电路的开关&#xff1b;从而表示0&#xf…

springai+pgvector+ollama实现rag

首先在ollama中安装mofanke/dmeta-embedding-zh:latest。执行ollama run mofanke/dmeta-embedding-zh 。实现将文本转化为向量数据 接着安装pgvector&#xff08;建议使用pgadmin4作为可视化工具&#xff0c;用navicate会出现表不显示的问题&#xff09; 安装好需要的软件后我们…

【python】OpenCV—Nighttime Low Illumination Image Enhancement

文章目录 1 背景介绍2 代码实现3 原理分析4 效果展示5 附录np.ndindexnumpy.ravelnumpy.argsortcv2.detailEnhancecv2.edgePreservingFilter 1 背景介绍 学习参考来自&#xff1a;OpenCV基础&#xff08;24&#xff09;改善夜间图像的照明 源码&#xff1a; 链接&#xff1a…

vue2 webpack使用optimization.splitChunks分包,实现按需引入,进行首屏加载优化

optimization.splitChunks的具体功能和配置信息可以去网上自行查阅。 这边简单讲一下他的使用场景、作用、如何使用&#xff1a; 1、没用使用splitChunks进行分包之前&#xff0c;所有模块都揉在一个文件里&#xff0c;那么当这个文件足够大、网速又一般的时候&#xff0c;首…

原厂商是什么意思?云管平台原厂商有哪些企业?

最近不少IT小伙伴在问关于原厂商相关问题&#xff0c;今天我们就来简单回答一下&#xff0c;仅供参考&#xff01; 原厂商是什么意思&#xff1f; 原厂商&#xff0c;或称原厂&#xff0c;是指生产特定产品或零部件的原始厂家。 软件原厂商是什么意思&#xff1f; 软件原厂…

课设:选课管理系统(Java+MySQL)

在本博客中&#xff0c;我将介绍用Java、MySQL、JDBC和Swing GUI开发一个简单的选课管理系统。 技术栈 Java&#xff1a;用于编写应用程序逻辑MySQL&#xff1a;用于存储和管理数据JDBC&#xff1a;用于连接Java应用程序和MySQL数据库Swing GUI&#xff1a;用于构建桌面应用程…

Let‘s Encrypt免费SSL证书申请最简单的步骤

随着互联网的飞速发展&#xff0c;网络安全问题愈发凸显其重要性。而HTTPS协议作为保障网站数据传输安全的重要手段&#xff0c;已经得到了广泛的应用。 申请Lets Encrypt免费泛域名SSL证书步骤 登录来此加密网站&#xff0c;输入域名&#xff0c;可以勾选泛域名和包含根域。…

Appium环境搭建,华为nova8鸿蒙系统(包括环境安装,环境配置)(一)

1.安装代码工具包 appium python client pip install appium-python-client 2.安装JDK 参考链接: ant+jmeter+jenkins从0实现持续集成(Windows)-CSDN博客 3.下载并安卓SDK 下载地址:AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载…

搜维尔科技:详谈ART的工具追踪技术

您的生产流程中是否已经受益于刀具跟踪系统&#xff1f;您是否意识到它们的价值&#xff1f;因为它们可以优化您的装配顺序&#xff0c;从而节省您的时间和金钱。 目前我们提供两种工具跟踪解决方案&#xff1a; 1.ART与 VERPOSE的解决方案——易于使用的图像识别 安装在工…

C语言 | Leetcode C语言题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; int robRange(int* nums, int start, int end) {int first nums[start], second fmax(nums[start], nums[start 1]);for (int i start 2; i < end; i) {int temp second;second fmax(first nums[i], second);first temp;}retur…

[激光原理与应用-97]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 1 - 什么是焊接以及传统的焊接方法

目录 一、什么是焊接 1.1 概述 1.2 基本原理 二、传统的焊接技术与方法 2.1 手工电弧焊&#xff1a; 1、定义与原理 2、特点 3、焊条类型 4、应用领域 5、安全注意事项 2.2 气体保护焊&#xff1a; 1、原理与特点 2、应用领域 3、气体选择 4、注意事项 2.3 电阻…

六角法兰面螺栓机械性能

六角法兰面螺栓&#xff0c;作为一种常见的紧固件&#xff0c;因其独特的设计和优良的机械性能&#xff0c;在众多工业领域中占据重要地位。与传统的六角头螺栓相比&#xff0c;六角法兰面螺栓的底部有一个扁平的法兰面&#xff0c;能够提供更大的接触面积&#xff0c;分散压力…

[leetcode] n个骰子的点数

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<double> statisticsProbability(int num) {vector<double> dp(6, 1.0 / 6.0);for (int i 2; i < num; i) {vector<double> tmp(5 * i 1, 0);for (int j 0; j < dp.size()…

算法day02 回文 罗马数字转整数

回文 搞错了String类型的indexOf方法&#xff0c;理解成获取对应下标的值&#xff0c;实际上是在找对应值的下标。 4ms 耗时最少的方法尽量不会去调用jdk提供的方法&#xff0c;而是直接使用对应的数学逻辑关系来处理&#xff0c; 甚至用 代替equals方法。 罗马数字转整数 考…

西安石油大学 课程习题信息管理系统(数据库课设)

主要技术栈 Java Mysql SpringBoot Tomcat HTML CSS JavaScript 该课设必备环境配置教程&#xff1a;&#xff08;参考给出的链接和给出的关键链接&#xff09; JAVA课设必备环境配置 教程 JDK Tomcat配置 IDEA开发环境配置 项目部署参考视频 若依框架 链接数据库格式注…

使用Python脚本实现SSH登录

调试IDE&#xff1a;PyCharm Python库&#xff1a;Paramiko 首先安装Paramiko包到PyCharm&#xff0c;具体步骤为&#xff1a;在打开的PyCharm工具中&#xff0c;选择顶部菜单栏中“File”下的“Settings”&#xff0c;在设置对话框中&#xff0c;选择“Project”下的“Proje…

taoCMS v3.0.2 文件上传漏洞(CVE-2022-23880)

前言 CVE-2022-23880是一个影响taoCMS v3.0.2的任意文件上传漏洞。攻击者可以利用此漏洞通过上传特制的PHP文件在受影响的系统上执行任意代码。 漏洞细节 描述: 在taoCMS v3.0.2的文件管理模块中存在任意文件上传漏洞。攻击者可以通过上传恶意的PHP文件来执行任意代码。 影响…

【IDEA】maven如何进行文件导入,配置并打包

一&#xff0c;介绍、安装 1、maven介绍 maven是一个Java世界中&#xff0c;构建工具。 核心功能&#xff1a; (1) 管理依赖&#xff1a; 管理文件运行的顺序逻辑依赖关系。对配置文件&#xff0c;进行构建和编译。其也是在调用jdk&#xff0c;来进行编译打包工作。 (2) 打…