怎么设置php报警告,什么样的代码叫好代码?
送大家以下java学习资料
简介: 我们每天都与代码打交道,但当被问道什么是好的代码时,很多人可能会先愣一下,然后给出的回答要么比较空泛,要么比较散,没办法简单明了地概括出来。显然,这个问题并没有唯一的标准答案,谁都可以谈论自己的理解,今天谈谈我对于好代码的理解。
我们每天都与代码打交道,但当被问道什么是好的代码时,很多人可能会先愣一下,然后给出的回答要么比较空泛,要么比较散,没办法简单明了地概括出来。显然,这个问题并没有唯一的标准答案,谁都可以谈论自己的理解,今天谈谈我对于好代码的理解。
一句话概括衡量代码质量的唯一有效标准:WTF/min —— Robert C. Martin
Bob大叔对于好代码的理解非常有趣,对我也有很大的启发。我们编写的代码,除了用于机器执行产生我们预期的效果以外,更多的时候是给人读的,这个读代码的可能是后来的维护人员,更多时候是一段时间后的作者本人。
我敢打赌每个人都遇到过这样的情况:过几周或者几个月之后,再看到自己写的代码,感觉一团糟,不禁怀疑人生。
我们自己写的代码,一段时间后自己看尚且如此,更别提拿给别人看了。
任何一个傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。—— Martin Fowler
所以,谈到好代码,首先跳入自己脑子里的一个词就是:整洁。
好的代码一定是整洁的,给阅读的人一种如沐春风,赏心悦目的感觉。
整洁的代码如同优美的散文。—— Grady Booch
好代码的特性很难给好的代码下一个定义,相信很多人跟我一样不会认为整洁的代码就一定是好代码,但好代码一定是整洁的,整洁是好代码的必要条件。整洁的代码一定是高内聚低耦合的,也一定是可读性强、易维护的。
高内聚低耦合
高内聚低耦合几乎是每个程序员员都会挂在嘴边的,但这个词太过于宽泛,太过于正确,所以聪明的编程人员们提出了若干面向对象设计原则来衡量代码的优劣:
开闭原则 OCP (The Open-Close Principle)单一职责原则 SRP (Single Responsibility Principle)依赖倒置原则 DIP (Dependence Inversion Principle)最少知识原则 LKP (Least Knowledge Principle)) / 迪米特法则 (Law Of Demeter)
里氏替换原则 LSP (Liskov Substitution Principle)接口隔离原则 ISP (Interface Segregation Principle)组合/聚合复用原则 CARP (Composite/Aggregate Reuse Principle)这些原则想必大家都很熟悉了,是我们编写代码时的指导方针,按照这些原则开发的代码具有高内聚低耦合的特性。换句话说,我们可以用这些原则来衡量代码的优劣。
但这些原则并不是死板的教条,我们也经常会因为其他的权衡(例如可读性、复杂度等)违背或者放弃一些原则。比如子类拥有特性的方法时,我们很可能打破里氏替换原则。再比如,单一职责原则跟接口隔离原则有时候是冲突的,我们通常会舍弃接口隔离原则,保持单一职责。只要打破原则的理由足够充分,也并不见得是坏的代码。
可读性
代码只要具有了高内聚和低耦合就足够好了吗?并不见得,我认为代码还必须是易读的。好的代码无论是风格、结构还是设计上都应该是可读性很强的。可以从以下几个方面考虑整洁代码,提高可读性。
命名
大到项目名、包名、类名,小到方法名、变量名、参数名,甚至是一个临时变量的名称,其命名都是很严肃的事,好的名字需要斟酌。
► 名副其实
好的名称一定是名副其实的,不需要注释解释即可明白其含义的。
/** * 创建后的天数 **/ int d; int daysSinceCreation;
后者比前者的命名要好很多,阅读者一下子就明白了变量的意思。
► 容易区分
我们很容易就会写下非常相近的方法名,仅从名称无法区分两者到底有啥区别(eg. getAccount()与getAccountInfo()),这样在调用时也很难抉择要用哪个,需要去看实现的代码才能确定。
► 可读的
名称一定是可读的,易读的,最好不要用自创的缩写,或者中英文混写。
► 足够短
名称当然不是越长越好,应该在足够表达其含义的情况下越短越好。
格式
良好的代码格式也是提高可读性非常重要的一环,分为垂直格式和水平格式。
► 垂直格式
通常一行只写一个表达式或者子句。一组代码代表一个完整的思路,不同组的代码中间用空行间隔。
public class Demo { @Resource private List<Handler> handlerList; private Map<TypeEnum, Handler> handlerMap = new ConcurrentHashMap<>(); @PostConstruct private void init() { if (!CollectionUtils.isEmpty(handlerList)) { for (Handler handler : handlerList) { handlerMap.put(handler.getType(), handler); } } } publicResult<Map<String, Object>> query(Long id, TypeEnum typeEnum) { Handler handler = handlerMap.get(typeEnum); if (null == handler) { return Result.returnFailed(ErrorCode.CAN_NOT_HANDLE); } return handler.query(id); } }
如果去掉了空行,可读性大大降低。
public class Demo { @Resource private List<Handler> handlerList; private Map<TypeEnum, Handler> handlerMap = new ConcurrentHashMap<>(); @PostConstruct private void init() { if (!CollectionUtils.isEmpty(handlerList)) { for (Handler handler : handlerList) { handlerMap.put(handler.getType(), handler); } } } public Result<Map<String, Object>> query(Long id, TypeEnum typeEnum) { Handler handler = handlerMap.get(typeEnum); if (null == handler) { return Result.returnFailed(ErrorCode.CAN_NOT_HANDLE); } return handler.query(id); } }
类静态变量、实体变量应定义在类的顶部。类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter 方法。
► 水平格式
要有适当的缩进和空格。
► 团队统一
通常,同一个团队的风格尽量保持一致。集团对于 Java 开发进行了非常详细的规范。(可点击下方阅读原文,了解更多内容)
类与函数
► 类和函数应短小,更短小
类和函数都不应该过长(集团要求函数长度最多不能超过 80 行),过长的函数可读性一定差,往往也包含了大量重复的代码。
► 函数只做一件事(同一层次的事)
同一个函数的每条执行语句应该是统一层次的抽象。例如,我们经常会写一个函数需要给某个 DTO 赋值,然后再调用接口,接着返回结果。那么这个函数应该包含三步:DTO 赋值,调用接口,处理结果。如果函数中还包含了 DTO 赋值的具体操作,那么说明此函数的执行语句并不是在同一层次的抽象。
► 参数越少越好
参数越多的函数,调用时越麻烦。尽量保持参数数量足够少,最好是没有。
注释
► 别给糟糕的代码加注释,重构他
注释不能美化糟糕的代码。当企图使用注释前,先考虑是否可以通过调整结构,命名等操作,消除写注释的必要,往往这样做之后注释就多余了。
► 好的注释提供信息、表达意图、阐释、警告
我们经常遇到这样的情况:注释写的代码执行逻辑与实际代码的逻辑并不符合。大多数时候都是因为代码变化了,而注释并没有跟进变化。所以,注释最好提供一些代码没有的额外信息,展示自己的设计意图,而不是写具体如何实现。
► 删除掉注释的代码
git等版本控制已经帮我们记录了代码的变更历史,没必要继续留着过时的代码,注释的代码也会对阅读等造成干扰。
错误处理
► 错误处理很重要,但他不能搞乱代码逻辑
错误处理应该集中在同一层处理,并且错误处理的函数最好不包含其他的业务逻辑代码,只需要处理错误信息即可。
► 抛出异常时提供足够多的环境和说明,方便排查问题
异常抛出时最好将执行的类名,关键数据,环境信息等均抛出,此时自定义的异常类就派上用场了,通过统一的一层处理异常,可以方便快速地定位到问题。
► 特例模型可消除异常控制或者 null 判断
大多数的异常都是来源于NPE,有时候这个可以通过 Null Object 来消除掉。
► 尽量不要返回 null ,不要传 null 参数
不返回 null 和不传 null 也是为了尽量降低 NPE 的可能性。
如何判断不是好的代码讨论了好代码的必要条件,我们再来看看好代码的否定条件:什么不是好的代码。Kent Beck 使用味道来形容重构的时机,我认为当代码有坏味道的时候,也代表了其并不是好的代码。
代码的坏味道
► 重复
重复可能是软件中一切邪恶的根源。—— Robert C.Martin
Martin Fowler 也认为坏味道中首当其冲的就是重复代码。
很多时候,当我们消除了重复代码之后,发现代码就已经比原来整洁多了。
► 函数过长、类过大、参数过长
过长的函数解释能力、共享能力、选择能力都较差,也不易维护。
过大的类代表了类做了很多事情,也常常有过多的重复代码。
参数过长,不易理解,调用时也容易出错。
► 发散式变化、霰弹式修改、依恋情结
如果一个类不是单一职责的,则不同的变化可能都需要修改这个类,说明存在发散式变化,应考虑将不同的变化分离开。
如果某个变化需要修改多个类的方法,则说明存在霰弹式修改,应考虑将这些需要修改的方法放入同一个类。
如果函数对于某个类的兴趣高于了自己所处的类,说明存在依恋情结,应考虑将函数转移到他应有的类中。
► 数据泥团
有时候会发现三四个相同的字段,在多个类和函数中均出现,这时候说明有必要给这一组字段建立一个类,将其封装起来。
► 过多的 if...else 或者使用 switch
过多的 if...else 或者 switch ,都应该考虑用多态来替换掉。甚至有些人认为除个别情况外,代码中就不应该存在 if...else 。
总结本文首先一句话概括了我认为的好代码的必要条件:整洁,接着具体分析了整洁代码的特点,又分析了好代码的否定条件:什么样的代码不是好的代码。仅是本人的一些见解,希望对各位以后的编程有些许的帮助。
我认为仅仅编写出可运行的代码是远远不够的,还要时刻注意代码的整洁度,留下一些漂亮的代码,希望写的代码都能保留并运行 102 年!
后续增加一些实际的例子来说明好的和坏的代码;分享下如何编写整洁代码——自己认为有用的一些编程技巧。
HTML怎么防止用户复制?
HTML渲染在浏览器中的内容是无法避免复制的,除非是图片中的文字,图片中的文字无法直接复制(OCR就不算复制了)。
文字,图片,视频还算是比较简单的东西,像一些公式,3维模型我也从浏览器的内存中提取出来过。
说着有点抽象,下面通过一个示例来演示下,整个过程有种“道高一尺魔高一丈”的感觉。
最近 CSDN 上了个不登录不能复制代码的功能,如下图所示,默认是不能登录的。
F12 打开浏览器的开发者工具,看看它是怎么实现的,发现样式规则有下面一条,原来是将user-select设置成了,none
找到原因,解决就容易了,直接使用内联样式覆盖就可以解决。如下图所示,直接加上内敛样式,user-select:all后就可以选择复制了。
有人说加上禁止查看页面代码就能避免复制,下面选中上面的tag然后加上如下设置,就能避免该tag通过右键查看代码,
temp0.oncontextmenu=function(){return false}
加上后,确实点击右键没有了反应,但是可以撤销上面的设置,如下设置后就又可以右键查看了。
temp0.oncontextmenu=""
自学java?
学习java贵在坚持,更要有目标,下面分享给你的这个学习路线图是2019年最新的学习路线图。
这个学习线路图我分为了几个阶段,每个阶段能学到什么,能做什么,具体知识点请往下看,每个阶段知识点我都整理出来了,更适合学习!
基础篇1.java基础入门
本套java基础入门教程包含四个重点知识点,全套免费视频教程。
知识点:
环境搭建:(重点掌握)
常用DOS命令及快捷键、EditPlus的安装、通用文本编辑快捷键、安装JDK、第一个Java程序的开发、Java注释、public class和class的区别。
基础语法:(重点与理解)
重点:变量、方法初步、运算符、数据类型、控制语句。
理解:标识符、关键字、字面量、方法重载/overload、方法执行是的内存变化、package与import。(方法重载/overload、方法递归、package与import里也包含重点)
IntelliJ IDEA工具的使用(重点)
数组初步:(重点与理解)
重点:一堆数组、可变长参数、二堆数组。
理解:数组数据结构详解、算法。
十一天阶段练习题
网盘链接:
链接:https://pan.baidu.com/s/1vf4ktCOO96_CTgnPInBCSg
提取码:u6ll
2.javase本套javaSE进阶视频教程包含八个知识点,全套视频教程免费
面向对象:(重点)
类的定义、对象的创建和使用、构造方法、当实例变量是一个引用的时候、封装性、this关键字、方法调用时参数的传递、空指针异常、累的继承、多态、final关键字、内部类......
数组高级特性:(重点)
数组拷贝及扩容、数组工具类Arrays的应用。
常用类:(重点及理解)
重点:
String、StringBuilder StringBuffer、Integer、Date。
掌握:
BigDecimal、枚举类型、随机数Random
集合:(重点及理解)
重点:
UML演示Collection继承结构图、Collection接口常用方法、Collection的通用迭代、UML演示Map继承结构图、Map接口中常用方法、Hashtable集合的子类Properties、TreeMap集合、泛型、Collections集合工具类。
理解:
集合概述、List集合、HashMap集合、HashMap、Hashtable、ConcurrentHashMap的区别、增强for循环。
反射机制:(重点及理解)
重点:
获取Class的三种方式、通过反射机制调用无参数构造方法创建对象、类加载。
理解:
通过反射机制访问对象的Field、通过反射机制调用对象的Method。
Annotation:(重点及理解)
重点:
JDK内置注解:@Override、总结注解在开发中有什么作用。
理解:
自定义注解、反射机制读取注解。
异常:(重点及理解)
重点:
异常继承结构图、处理异常、finally语句块、final、finalize、finally有什么区别、异常在实际开发中的作用。
理解:
异常概述、方法覆盖与异常。
Java新特性:(重点及理解)
Java7特性重点:
switch支持String、泛型自动类型推断
理解:可catch多个异常,异常之间使用“|”分隔
Java8特性重点:Lambda表达式、接口中的默认方法和静态方法、新的Date API。
javaweb前端本套Web前端的知识点包含六个部分
javaSE:(重点及理解)
重点:
IO流、多线程以及线程的同步面试题。
理解:
NIO、网络编程。
MySQL:(重点及理解)
重点:
登录MySQL、基本命令、初始化测试数据、简单查询、条件查询、排序操作、分组函数、分组查询、单表DQL总结、链接查询、子查询、union&union all、limit、表、事务、视图、DBA命令、数据库设计三范式、34道SQL作业题。
理解:
MySQL安装与完美卸载、DBMS、SQL、DB、表的概述、SQL的分类、常用命令、数据处理函数、存储引擎、索引。
JDBC:(重点及理解)
重点:
JDBC编程六步、使用Statement完成增删改、连接数据库的信息在属性资源文件中配置、安装PowerDesigner工具,设计用户表、Statement和PreparedStatement区别、PreparedStatement演示增删改、PreparedStatement演示模糊查询、JDBC事务、悲观锁for update和for update nowait、java.util.Date和java.sql.Date的区别与相互转换、封装DBUtil工具类。
理解:
接口在开发中的作用、驱动配置、Statement演示登录时的SQL注入问题、PreparedStatement解决SQL注入。
HTML:(重点及链接)
重点:
第一个HTML、实体符号、表格、图片、超链接、列表、表单、HTML中元素的id属性、div和span。
理解:
HTML概述、基本标签、背景颜色和背景图片。
CSS:(重点及理解)
重点:
HTML中嵌入CSS样式的三种方式、边框、隐藏、字体、文本装饰、列表、设置鼠标悬停效果、内边距和外边距、布局float、定位、鼠标小手。
理解:
CSS的理解。
JavaScript:(重点及理解)
重点:
嵌入JS三种方式以及JS的注释、变量、null NaN undefined区别、JS中的事件、JS运算符之void、JS内置对象、DOM编程案例、BOM编程案例、JSON对象、总结一下浏览器向服务器发送请求的常见方式。
理解:
JavaScript概述、JavaScript包括三块:ECMAScript、DOM、BOM、标识符和关键字、JS数据类型(ES6版本之前的数据类型有6种 重点)、JS之控制语句、BOM和DOM的区别与联系。
JavaWeb:本阶段视频教程包含八个知识点——全套视频教程免费
XML:(重点及理解)
重点:
XML(XML在实际开发中的作用、XML和JSON的对比)、Java解析XML:(dom4j+xpath解析XML)
理解:
XML概述、XML解析、Java解析XML
Servlet:(重点及理解)
重点:
tomcat服务器安装与配置、开发第一个Servlet程序、单实例多线程环境下运行的Servlet、HTTP协议详解、ServletContext、HttpServletRequest、HttpServletResponse、web开发中乱码的解决方案、Cookie、HttpSession、转发与重定向、Filter、案例
理解:
系统结构概论、Servlet对象生命周期、GenericServlet、HttpServlet、ServletConfig、Listener、Servlet3.0新特性
JSP:重点
重点:
JSP基础语法、EL表达式、JSTL标签、案例。
Maven:(重点及理解)
重点:
Maven的安装与配置、第一个Maven工程、IntelliJ IDEA中使用Maven、修改本地仓库的路径、Maven的插件。
理解:
Maven概述、Maven基础知识
MVC机构模式:(重点及理解)
重点:
MVC架构模式和三层架构(表示层、业务层、持久层)或多层架构的区别与联系、案例3:改造案例2,改造之前的DBUtil工具类,将Connection对象放到ThreadLocal当中,在service层控制事务和关闭Connection对象,关闭Connection时将它从ThreadLocal中移除、GoF之代理模式:动态代理(JDK动态代理)、案例4:改造案例3,使用动态代理模式处理service层事务。
理解:
案例1:不使用MVC架构模式开发账户转账功能,分析缺点、MVC架构模式的分层理论、案例2:使用MVC架构模式改造案例1,总结优点、GoF之代理模式:静态代理。
AJAX:(重点及理解)
重点:
AJAX发送get请求、AJAX的get请求缓存解决方案、AJAX发送post请求、AJAX什么情况下使用同步方式
理解:
AJAX概述、AJAX实现原理(异步通信原理)
jQuery:(重点及理解)
重点:
jQuery概述、我的第一个jQuery程序、DOM对象与jQuery对象、jQuery的事件处理、jQuery九大选择器、jQuery对象的常用方法、jQuery元素的遍历、jQuery发送AJAX请求、AJAX跨域、未来新增元素的事件绑定
理解:
jQuery动画
综合案例(重点):使用Servlet+JSP+MVC+AJAX+jQuery+Maven完成单表数据维护
JavaWeb项目:本阶段视频教程包含六个知识点——全套视频教程免费
MyBatis:(重点及理解)
重点:
开发第一个MyBatis程序、MyBatis集成log4j打印日志信息、实现insert操作并演示MyBatis的事务机制、使用单独的属性资源文件配置连接数据库的信息、sqlMapper配置文件中namespace的作用、MyBatis的别名机制、MyBatis完成单表selectList操作、MyBatis完成update操作、MyBatis完成delete操作、作用域(Scope)和生命周期、在WEB应用的持久层DAO中使用MyBatis、MyBatis使用动态代理机制生成DAO接口的实现类、SqlMapper配置文件采用package的方式扫描、MyBatis的别名机制采用package的方式、parameterType详解、多参数传递、resultType详解、resultMap基本应用、#{}和${}的区别及选用。
理解:
MyBatis概述、resultMap高级应用、MyBatis的延迟加载机制、动态SQL、一级缓存和二级缓存、MyBatis-Plus、Mybatis通用Mapper、MyBatis分页插件PageHelper。
GIT:(重点及理解)
重点:
安装Git、Git版本库、时光机穿梭、远程仓库、分支管理、标签管理、使用GitHub、使用码云、搭建Git服务器、IDEA集成Git、IDEA中使用Git。
理解:
Git概述。
BootStrap:(重点及理解)
重点:
下载Bootstrap库、第一个Bootstrap程序、完成Bootstrap案例。
理解:
Bootstrap概述、常见的前端UI框架有哪些、JS、jQuery、Bootstrap的区别与联系、要实现的Bootstrap案例效果展示。
CRM:(重点)
重点:
软件开发生命周期、CRM核心业务介绍、CRM核心功能实现。
Linux:(重点及理解)
重点:
Linux常用命令、发布web项目到Linux。
理解:
Linux操作系统概述、安装虚拟机vmware、在虚拟机上安装Linux操作系统CentOS7、CentOS7操作系统目录介绍、常见操作Linux的远程工具包括哪些、远程工具。
这两个专业在哪些领域用得最多?
从事嵌入式开发十几年,基本上围绕着这两种编程语言展开,都可以直接操作底层的编程语言,用的越熟练越是感觉工具属性越强。虽然两种编程语言分属于不同的编程思想,用的时间长了觉得差异也不是很大,现在就个人的从业经历,讲述下两种编程语言的差异和共同之处。
现在已经很多人觉得c语言过时了,因为从招聘的需求看要求JAVA的明显居多,Python现在基本上雷声大雨点小还成不了气候,现在很多主流的客户端框架还是C语言和C++的天下,毕竟性能是谁也绕不过去的事情,从就业的绝对数量上两种的数量并不低,但是入门的门槛提升了,简单学点很难找到工作,而且一旦找到合适的工作,工资水平并不低,所以很多人觉得这两种编程语言过时了主要是初学者喊出来的,初学的人总想找个好学编程语言,由于入门难度高加上相对就业机会少,少并不是代表着不重要,但凡有点编程经验的人都会觉得这两种编程语言极其重要。
这两种编程语言有什么区别,相对来讲C语言简单一点,C语言属于面向过程的语言,非常符合编程的思想,基本上功能可以直线化陈述,C语言语法细节不是很多但组合非常灵活,曾经在刚学C语言的时候学了一个月就膨胀了觉得什么C语言的代码都能搞定了,结果去图书馆借了一本Linux内核的书籍去学习看了100多页就彻底放弃了,理论和实践差异太大了,所以不要觉得C语言好学但在实际使用过程中,不真实做过项目永远不要轻易下结论是不是真的掌握了。
C++属于比较难得编程语言,也是个人觉得最难得编程语言,主要是语法细节繁多而且还在不停的更新,所以很多人在学习之初觉得能够编译通过就是一件非常幸福的事情,这门编程语言的设计理念是尽量在编译环节排除语法细节错误,所以很多人觉得C语言编译就会简单许多,带着警告照样可以编译通过,程序也可以继续执行。这门编程属于面向对象理念,什么事情都离不开对象和类,核心思想是多态,继承,封装,看着很简单真要在实践中掌握明白,不经过项目的洗礼基本不可能的事情。
如果非要说出这两种编程语言的差异,初学者可以考虑从C语言入手这样入门简单些,然后再去切入C++的学习,稍微有点编程经验的程序员都会淡化编程语言本身,编程的本质不是掌握了多少编程语言而是编程思想是不是掌握彻底了,到了这种层面也不会在乎什么编程语言了,学习任何东西都要掌握问题的本质,不要只看表面的现象,只要自己认准的事情全力以赴的做就可以了。
不要在选择上花费太多的时间,选择了就全力去做,中间不要随便切换编程语言,这山看着那山高注定什么也学不会。
希望能帮到你。
0基础建议学什么编程语言?
学习什么编程语言主要取决于你对哪方面感兴趣,每一款语言的诞生都是为了解决某一领域的问题。
C语言C语言既有高级语言的特点也有汇编语言的特点。C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于嵌入式开发、驱动开发,对运行效率要求极高的软件开发,系统软件开发和图形开发。运行效率很高,上手难度也高。
代表作:windows,linux
难度指数:5
推荐指数:1
C++C语言的继承,和C的语法类似,但增加了面向对象的功能。主要应用领域是游戏开发,服务器端开发,数字图像处理等方面。
代表作:QQ,Offices
难度指数:5
推荐指数: 1
JAVA万金油编程语言。一款高级编程语言。不仅吸收了C++语言的各种优点,还摒弃了C++令人发指的指针,多继承等功能。语言功能非常强大,安全性很高。主要用于桌面应用程序开发,web应用程序开发,分布式系统和嵌入式系统。
代表作:android软件,ATM机程序。
难度指数:3
推荐指数:5
pythonpython是一款解释型脚本语言,语法简洁,是一款富有哲学思想的语言。语言不需要编译,可以直接运行。主要应用于web开发,科学计算和统计,人工智能,后端开发,爬虫开发。
代表作:instagram,uber,reddit
难度指数:3
推荐指数:5
C#微软开发出来的一款面向对象的语言。和java一样,但是跨平台方面做的不好。主要用于windows上面的软件开发,.net后段开发,游戏脚本开发(unity3d游戏引擎脚本)
代表作:windows商店所有应用(win10专属),王者荣耀客户端(unity脚本语言)
难度指数:3
推荐指数:3
PHP一种通用的脚本语言。主要在服务器上执行的脚本语言。主要领域是web开发。
代表作:部分网页后端
难度指数:3
推荐指数:3