入门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

<?phpclass 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()方法是程序调用一个未定义或者不可见的成员变量时执行的,该方法参数只有一个就是被调用的变量名。

<?phpclass 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方法返回123var_dump($s->b);//输出int(123) 私有变量调用get方法返回123var_dump($s->c);//输出NULL 公有变量未赋值 返回NULLvar_dump($s->d);//输出int(0) 公有变量赋值了,返回赋值结果 0var_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()方法包含两个参数,即方法名和方法参数(以数组形式存在)。

<?phpclass 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输出对象时,将对象转换成字符串。

<?phpclass 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,代码如下:
 

<?phprequire('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
<?phpfunction 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;?>

 

<?phpclass SportObject{private $cont;public function __construct($cont){$this->cont=$cont;}public function __toString(){return $this->cont;}}?>

 

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

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


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

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

 

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

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

相关文章

采用B/S模式 可跨平台使用的数据采集监控平台!

数据采集监控平台是一款专注于工业企业生产设备管理、数据采集、数据分析、数据管理、数据存储、数据传输等的软件系统。系统具备丰富的接口&#xff0c;配置灵活&#xff0c;方便部署&#xff0c;通过采集企业生产设备的数据集中处理&#xff0c;将各个信息孤岛有机连接&#…

技术赋能政务服务:VR导视与AI客服在政务大厅的创新应用

在数字化转型的浪潮中&#xff0c;政务大厅作为服务民众的前沿阵地&#xff0c;其服务效率和质量直接影响着政府形象和民众满意度。然而&#xff0c;许多政务大厅仍面临着缺乏智能化导航系统的挑战&#xff0c;这不仅增加了群众的办事难度&#xff0c;也降低了服务效率。维小帮…

ArcEngine获取投影坐标,地理坐标,垂直坐标系统以及3或6分度带的代码

本代码是用于质检中获取图层中平面坐标系统是否采用“2000国家大地坐标系(CGCS2000)高程系统是否采用“1985国家高程基准”。然后封装的一个方法 /// <summary>/// 平面坐标系统是否采用“2000国家大地坐标系(CGCS2000)高程系统是否采用“1985国家高程基准”。/// &l…

Windows的磁盘管理

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 第一动态磁盘管理 问题&#xff1a;…

Jackson与Json、Json和各种Java数据类型的互相转化

jackson是什么 json是最常用的数据交换格式 Jackson是最流行的Json库 首先对于这种JSON序列化的库其实有非常多&#xff0c;比如我们熟悉的Gson&#xff0c;Fastjson等等&#xff0c;当然技术没有完全的好坏&#xff0c;但是从使用情况和社区生态等方面综合看来&#xff0c;Ja…

【讲解下AI Native应用中的模型微调】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Jenkins 任务中的 java.lang.InterruptedException 异常解析与解决

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

列表渲染 v-for

列表渲染v-for 使用v-for指令基于数组渲染一个列表&#xff0c;v-for指令的值需要使用item in/of items形式的特殊语法&#xff0c;其中items是源数据的数组&#xff0c;而item是迭代的别名。 代码实例&#xff1a; <template> <div><p v-for"item in na…

室内效果图渲染要多久?

效果图的渲染时间并非固定&#xff0c;一张效果图的渲染时间可能从几分钟到几小时不等&#xff0c;甚至对于非常复杂和高质量的渲染任务&#xff0c;可能需要几天的时间。影响效果图渲染时间的因素有很多&#xff0c;今天就给大家介绍一下。 电脑配置 一、电脑配置 CPU和GPU…

TensorFlow安装CPU版本和GPU版本

文章目录 前言一、TensorFlow安装CPU版本1.新建虚拟环境2.激活虚拟环境3.下载tensorflow4.验证是否下载成功 二、TensorFlow安装GPU版本1.新建虚拟环境2.激活虚拟环境3.安装tensorflow-gpu4.验证是否下载成功 前言 下载的Anaconda是Anaconda3-2024.02-1-Windows-x86_64版本 一…

Python | Leetcode Python题解之第216题组合总和III

题目&#xff1a; 题解&#xff1a; class Solution:def combinationSum3(self, k: int, n: int) -> List[List[int]]:"""回溯法&#xff0c;对于当前k和n, 枚举元素"""def backtracking(k: int, n: int, ans: List[int]):if k 0 or n <…

django学习入门系列之第四点《案例 博客案例》

文章目录 container面板案例 博客案例往期回顾 container 堆叠到两边 <div class"container-fluid clearfix"><div class"col-sm-9">1</div><div class"col-sm-3">2</div> </div>放在中间 <div clas…

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

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

学习笔记——动态路由——OSPF工作原理(SPF算法)

3、SPF算法 SPF算法(最短路径优先算法&#xff0c;也称Dijkstra算法)由荷兰科学家狄克斯特拉于1959年提出的。 SPF算法将每一个路由器作为根(ROOT)来计算其到每一个目的地路由器的距离&#xff0c;每一个路由器根据一个统一的数据库会计算出路由域的拓扑结构图&#xff0c;该…

Go语言--函数类型、匿名函数和闭包

在Go语言中&#xff0c;函数也是一种数据类型&#xff0c;我们可以通过 type 来定义它&#xff0c;它的类型就是所有拥有相同的参数&#xff0c;相同的返回值的一种类型。 语法 通过type给函数类型起名&#xff0c;然后通过名字进行函数的调用 好处&#xff1a;多态 通过统…

信息安全驱动汽车行业快速向数字化转型

开发一款安全性良好的软件是困难的&#xff0c;它需要专业知识的积累以及对常见编程缺陷和规则的了解&#xff0c;例如检查输入范围、管理内存分配和回收、寻址字符串格式、避免悬空指针等等。通常情况下&#xff0c;编写安全代码与开发人员编写“流畅”代码的自然愿望形成了对…

【数据库】第7讲 关系数据模型(章节测验)

一. 单选题 1【单选题】下面对于关系的叙述中&#xff0c;不正确的是&#xff08;C&#xff09; A、关系中的每个属性是不可分解的B、在关系中元组的顺序是无关紧要的C、任意的一个二维表都是一个关系D、每一个关系只有一种记录类型 2【单选题】关系模型的完整性约束不包括&…

日本最新型高达式巨型机器人承担铁路维护任务

日本有制造现实生活中的高达式巨型机器人的历史&#xff0c;但它们往往是用于娱乐目的&#xff0c;而不是实际应用。不过&#xff0c;日本刚刚开始使用一个 40 英尺高的人形机器人来维护铁路线。 大约两年前&#xff0c;西日本铁路公司&#xff08;JR 西日本&#xff09;制造了…

【Unity】RPG2D龙城纷争(八)寻路系统

更新日期&#xff1a;2024年7月4日。 项目源码&#xff1a;第五章发布&#xff08;正式开始游戏逻辑的章节&#xff09; 索引 简介一、寻路系统二、寻路规则&#xff08;角色移动&#xff09;三、寻路规则&#xff08;角色攻击&#xff09;四、角色移动寻路1.自定义寻路规则2.寻…

[C++]——同步异步日志系统(2)

同步异步日志系统 一、 不定参函数1.1 不定参宏函数的使用1.2 C 语言中不定参函数的使用1.3 C不定参数使用 二、设计模式2.1 单列模式2.2 工厂模式2.3 建造者模式2.4 代理模式 在我们开发同步异步日志系统之前&#xff0c;需要了解一些相关的技术知识。 一、 不定参函数 在初学…