求职指南网 > 面试试题 >

php程序员面试题目和答案

时间: 淑娟 面试试题

PHP是一种用来制作动态网页的服务器端脚本语言,你通过PHP和HTML创建页面。今天小编整理了php程序员面试题目和答案供大家参考,一起来看看吧!

php程序员面试题目和答案

php程序员面试题目和答案(精选篇1)

1、nginx 的工作原理

Nginx 由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅

通过查找配置文件将客户端请求映射到一个 location block(location 是 Nginx 配置中

的一个指令,用于 URL 匹配),而在这个 location 中所配置的每个指令将会启动不同的模块

去完成相应的工作。

2、PHP-FPM

Master 主进程 / Worker 多进程模式。

启动 Master,通过 FastCGI 协议监听来自 Nginx 传输的请求。

每个 Worker 进程只对应一个连接,用于执行完整的 PHP 代码。

PHP 代码执行完毕,占用的内存会全部销毁,下一次请求需要重新再进行初始化等各种繁琐的操作。

只用于 HTTP Server。

Swoole

Master 主进程(由多个 Reactor 线程组成)/ Worker 多进程(或多线程)模式

启动 Master,初始化 PHP 代码,由 Reactor 监听 Socket 句柄的事件变化。

Reactor 主线程负责子多线程的均衡问题,Manager 进程管理 Worker 多进程,包括 TaskWorker 的进程。

每个 Worker 接受来自 Reactor 的请求,只需要执行回调函数部分的 PHP 代码。

只在 Master 启动时执行一遍 PHP 初始化代码,Master 进入监听状态,并不会结束进程。

不仅可以用于 HTTP Server,还可以建立 TCP 连接、WebSocket 连接。

3、为什么 PHP7 比 PHP5 性能提升了?

(1)、变量存储字节减小,减少内存占用,提升变量操作速度

(2)、改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率

(3)、改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率

3、mysql主从的同步原理是什么?

当主数据服务器master进行写入数据或者更新数据操作的时候,数据更改会记录在二进制日志(binary log file)中,主服务器master与从服务器slave进行通讯的是I/O线程,它将修改的数据异步复制写入到slave服务器的中继日志(relay log file)中,从服务器slave与中继日志之间通信使用SQL线程,SQL线程可以异步从中继日志中读取数据后再写入到自己的数据库中,就完成了数据的主从同步功能。

主要:二进制日志

细节体现:

为什么有主从延迟:

1. Master负载过高、

Slave负载过高、

2.网络延迟、

机器性能太低、

MySQL配置不合理

3.怎么预防主从延迟:

缓存

4.订单为什么要拆单?如果拆单依据是什么?

因为考虑一个用户购买多个商品,多个商品属于多个商家。多个商家要发货,并且分钱。所以拆单

1.按照店铺拆分

2.按照商品类型拆分

如果拆单表设计如何设计?

5什么情况下使用不了索引

1.复合索引:不遵循最左原则

2.模糊查询 “%k”

3.如果mysql认为全表扫面要比使用索引快,则不使用索引。

4.有逻辑运算符////2+2

5.如果条件中有 or, 有条件没有使用索引,即使其中有条件带索引也不会使用,换言之, 就是要求使用的所有字段,都必须单独使用时能使用索引。

6.如果列类型是字符串,那么一定要在条件中使用引号引用起来,否则不使用索引。

6.laravel和tp的区别

1.Laravel 在表单提交的时候会有csrf 跨站请求伪造验证,Tp5则没有

2.Laravel 在请求需要先定义路由,Tp5可以不定义,有pathinfo路由即可访问

3.Laravel 在请求之前会有中间件, Tp5会有前置操作和钩子

7.http和https区别

https数据加密 ===非对称加密

http明文传输

8.接口安全如何处理

1.访问

防刷

存储ip地址

accessToken

2.数据

一个传输过程中

http https

数据本身加密

对称加密

有一个秘钥

非对称加密

公钥

私钥

9.redis和memcache区别

1.数据类型

redis:字符串,hash,队列,有序集合,集合 memcache:字符串

2.存储方式

memcache:内存存储不支持持久化 redis:支持持久化

3.内存管理

redis:直接管理空间 memcache:将内存空间切割成大小不同的空间,按照存储数据的大小进程存储

10.如何理解雪崩,缓存穿透

缓存穿透:在缓存里面有数据,但是查询不到。所以读取数据库。

缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

解决方案

有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

缓存雪崩

缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。

解决方案

缓存失效时的雪崩效应对底层系统的冲击非常可怕。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线 程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。这里分享一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

11.反向代理主调度器挂掉如何处理

热备开启

12.http和websocket的区别

WebSocket是HTML5中的协议,支持持久连接;而Http协议不支持持久连接

13、¥this与$self的区别

1.self可以访问本类中的静态属性和静态方法,可以访问父类中的静态属性和静态方法。用self时,可以不用实例化的

1.this可以调用本类中的方法和属性,也可以调用父类中的可以调的方法和属性,可以说除过静态和const常量,基本上其他都可以使用this联络

14、订单合单怎么合单

我们在订单处理工作中,如果一个交易单(父订单)下的多个子订单,客户要求发往不同的地址,那么就要把这个“交易单”对应生成多个“物流单”,这叫“订单拆分”。

如果客户不是通过购物车,而是分两次买下两个商品,则出现两个“交易单”,且寄往同一个地址,我们对两个交易单只需要产生一个“物流单”,这叫“订单合并”。

15、支付同步和异步

同步是给客户看的,异步是服务器处理请求。

同步是客户充值或者支付成功了,给客户一个提示,告诉客户这个操作的结果是成功还是失败。起到的作用就是提示客户这个操作的结果是成功还是失败。

异步是服务器在后端处理支付成功或失败时的业务逻辑。同步通知:用于用户在支付宝页面付款完毕后自动跳转;

异步通知:其实是处理业务逻辑,比如说修改客户的支付状态;

同步得到通知后跳转到自己的网址,然后根据参数告诉客户支付结果,然后在更新状态。

异步其实就是一个双保险,如果同步没有跳转你的网址,可能是关机了,或者网速慢,无法完成数据更新的状态,这时候异步就发挥作用了,先判断是否支付,支付了就不必更新了,只返回支付宝 success 就行了,不然会一直异步通知

16、接口安全

接口安全一般分三部分:调用方身份令牌token(防CSRF攻击)、参数签名sign(防篡改)、时效性timestamp(防Dos攻击)

17、消息队列

我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。

18、http协议

HTTP协议是构建在TCP/IP协议之上的,是TCP/IP协议的一个子集,所以要理解HTTP协议,有必要先了解下TCP/IP协议相关的知识

TCP/IP协议族是由一个四层协议组成的系统,这四层分别为:应用层、传输层、网络层和数据链路层

19、TCP协议三次握手的描述如下:

第一次握手:客户端发送带有SYN标志的连接请求报文段,然后进入SYN_SEND状态,等待服务端的确认。

第二次握手:服务端接收到客户端的SYN报文段后,需要发送ACK信息对这个SYN报文段进行确认。同时,还要发送自己的SYN请求信息。服务端会将上述的信息放到一个报文段(SYN+ACK报文段)中,一并发送给客户端,此时服务端将会进入SYN_RECV状态。

第三次握手:客户端接收到服务端的SYN+ACK报文段后,会想服务端发送ACK确认报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED状态,完成TCP三次握手。

发送的都是SYN,验证ACK,再次回返

释放的SYN ACK的报文段

20、短连接

长链接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。

管线化机制须通过永久连接(persistent connection)完成,仅HTTP/1.1支持此技术(HTTP/1.0不支持),管线化不需要等待上一次请求得到响应就可以进行下一次请求。实现并行发送请求。

21、请求行:

方法:

GET 获取资源

POST 向服务器端发送数据,传输实体主体

PUT 传输文件

HEAD 获取报文首部

DELETE 删除文件

OPTIONS 询问支持的方法

TRACE 追踪路径

协议/版本号

URL

请求头:

通用首部(General Header)

请求首部(Request Header)

响应首部(Response Header)

实体首部(Entity Header Fields)

响应行

HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

响应头

Date:生成响应的日期和时间;

Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1

响应体

22.laravel 生命周期

1.加载public 下 index.php

2.通过composer加载bootstrap/app.php 获取laravel实例

3.创建一个服务容器

4.加载kernel.php文件

5.加载服务提供者

6.通过request 分发请求,经过路由,中间件,找到控制器的方法

7.处理请求,返回结果

23.laravel框架契约

Laravel 中的契约是指框架提供的一系列定义核心服务的接口

契约作用::松耦合和简单。

简单

当所有 Laravel 服务都统一在简单接口中定义,很容易判断给定服务提供的功能。契约可以充当框架特性的简明文档。

此外,基于简单接口,代码也更容易理解和维护。在一个庞大而复杂的类中,与其追踪哪些方法是有效的,不如转向简单、干净的接口

松耦合

由于我们基于一个来自包的具体的缓存类,如果包的API变了,那么相应的,我们的代码必须做修改。

24、分区类型

分区类型:

range分区:基于属于一个给定连续区间的列值,把多行分配给分区

list分区:类似于按range分区,区别在于List分区是基于列值匹配一个离散值集合中的某个值来进行选择

hash分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySql中有效的、产生非负整数值得表达式

key分区:类似于按HASH分区,区别在于Key分区只支持计算一列或多列,且MySql服务器提供其自身的哈希函数。必须有一列或多列包含整数

RANGE分区(分区是按照顺序定义的):

基于属于一个给定连续区间的列值,把多行分配给分区

这些区间要连续且不能重叠,使用values less than操作符来进行定义

LIST分区(增删变得容易)

类似于按RANGE分区,区别在于List分区是基于列值匹配一个离散集合中的某个值来进行选择

List分区通过使用" partition by list(expr)" 来实现,其中"expr"是某列值、并返回一个整数值的表达式,然后通过"valus in(value_list)"的方式来定义每个分区,其中"value_list"是一个通过逗号分隔的整数列表

HASH分区

基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。

要使用HASH分区来分割一个表,要在CREATE TABLE 语句上添加一个“PARTITION BY HASH (expr)”子句,其中“expr”是一个返回一个整数的表达式。它可以仅仅是字段类型为MySQL整型的一列的名字。此外,你很可能需要在后面再添加一个“PARTITIONS num”子句,其中num是一个非负的整数,它表示表将要被分割成分区的数量

KEY分区

类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值

25、线程和进程各自有什么区别和优劣呢?

进程是资源分配的最小单位,线程是程序执行的最小单位。

进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

26、接口调用这8种请求方式:

1.GET:向特定资源发送请求,查询数据

2.POST:向指定的资源,提交数据进行处理请求,有可能创建或修改已有数据

3.HEAD:和Get请求相一致,只不过不会返回响应体,这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。(用于获取报头)

4.OPTIONS:返回服务器对特定资源所支持的http的请求,可以用来向Web服务器发送请求来测试服务器的功能性

5.PUT:向指定资源位置上传最新的内容

6.DELETE:请求服务器删除Request-URI所标识的资源

7.TRACE:回显服务器收到的请求,主要用于测试或诊断

8.CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

27.laravel容器

Laravel 服务容器是一个用于管理类依赖和执行依赖注入的强大工具。依赖注入听上去很花哨,其实质是通过构造函数或者某些情况下通过 set 方法将类依赖注入到类中。

28.laravel ORM 和查询构建器关系?

所谓查询构建器,就是操作数据库的方法拢在一起组成个一个类!

在laravel的ORM中,一个类对应一张表,而一个模型可以当做一个Illuminate\Database\Eloquent\Builder的构建器使用

29.优化一个网站

页面的ob缓存,动静分离

架构上,反向代理,容灾,热备

缓存数据

数据库的索引,主从

30、上线流程?

1.把应用从负载均衡器上摘除(mark down)

注意:利用haproxy进行mark down ,通过管理页面把服务标记成下线的状态,但是要注意这个时候正在处理的请求是还在处理的只是新的请求进不来,这一步是非常重要的,涉及到服务的可用性问题;并且mark down之后是不能立刻停止服务的,一般要等10~20秒的时间给未处理完的请求预留时间

还要注意如果你使用手动mark down是很烦人的,如果机器有很多台你还要一台台去mark down 上线好之后还要去mark up 只要是人进行的工作都是会有错误产生的,所以可以使用基于内容的状态检测页面,,当检测到某字段或内容时把服务mark up,当服务器数量较多时可使用自动化运维工具例如ansible也非常简单

2.stop service

3.deploy war 自动部署

4.change new link 就是第三步中说到的内容

一般在工作中是用links软链接,比如这里有war2.1 war2.2 war2.3 war2.4,我要上线的时候只需要改一下软链接(这样就不必去修改配置文件了)并且使用软链接还有一个好处是当你发现新上线的包有问题时可以快速回滚,当然还有其它方法可以实现,但是一般大公司比如腾讯,百度,阿里都采用这种上线方式

5.start service

6.mark up

31、php垃圾回收机制?

1.php引用计数基本知识点

每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference set)。通过这个字节,php引擎才能把普通变量和引用变量区分开来,由于php允许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使用。第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。所有的符号存在一个符号表中,其中每个符号都有作用域(scope),那些主脚本(比如:通过浏览器请求的的脚本)和每个函数或者方法也都有作用域

2.php的内存管理机制

https://www.cnblogs.com/myJuly/p/10002397.html:转载

3.php中垃圾是如何定义的?

判断是否为垃圾,主要看有没有变量名指向变量容器zval,如果没有则认为是垃圾,需要释放

4.老版本php中如何产生内存泄漏?

产生内存泄漏主要真凶:环形引用。

5.5.3版本以后php是如何处理垃圾内存的?

1.如果一个zval的refcount增加,那么此zval还在使用,不属于垃圾

2.如果一个zval的refcount减少到0, 那么zval可以被释放掉,不属于垃圾

3.如果一个zval的refcount减少之后大于0,那么此zval还不能被释放,此zval可能成为一个垃圾

来个白话文版:就是对此zval中的每个元素进行一次refcount减1操作,操作完成之后,如果zval的refcount=0,那么这个zval就是一个垃圾

6.涉及到垃圾回收的知识点

gc_enable() : 开启GC

gc_disable() : 关闭GC

gc_collect_cycles() : 在节点缓冲区未满的情况下强制执行垃圾分析算法

mysql默认编码?

拉丁编码

32、什么是索引覆盖?

如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。

只扫描索引而无需回表的优点:

1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。

2.因为索引是按照列值顺序存储的,所以对于IO密集的范围查找会比随机从磁盘读取每一行数据的IO少很多。

3.一些存储引擎如myisam在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用

4.innodb的聚簇索引,覆盖索引对innodb表特别有用。(innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询)

覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql只能用B-tree索引做覆盖索引。

索引的数据结构?

索引的数据结构:B-、B+、R-、散列

laravel框架门面?

1.购物车商品价格变化?

购物车储存一个商品id,商品其他属性数据库读取

监听服务器端保存价格的数据库。如何价格发生变化,在启动客户端时,对价格根据服务器的数据库数据进行刷新就可以了

33.事务的操作?

34.事务的隔离级别,幻读,脏读如何出来的.

1.脏读:

脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

3.幻读:

是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象

发生了幻觉一样。

6.事务特性哪些

7.索引种类

35、解析PHP全过程

用户请求-》PHP处理-》zend转化成中间吗(c编写)->opcache -> 操作系统-》转成汇编->计算器识别-》ob缓存-》nginx-》协议-》客户端

php程序员面试题目和答案(精选篇2)

PHP常见的运行模式有2种,分别是php-fpm 和php-cli 。当PHP 选择运行在php-fpm模式下,所有的变量都是页面级的,无论是全局变量还是类的静态成员,都会在页面执行完毕后被清空。运行在php-cli模式下可以实现程序常驻内存,各种变量和数据库连接都能长久保存在内存 实现资源复用,性能可以得到很大的提升,php-cli虽然开发比较复杂,但是能够获取更高的性能,对开发者的要求比较高需要比较高的开发水平,比较常用的模式是结合swoole 组件编写cli框架,各种变量能保存在跨进程的高性能共享内存 Table ,可以开发出支持热启动的php-cli可靠各类应用系统。

php-fpm在PHP 5.3.3 版本成为了官方正式组件(2010-07-22),它提供了稳定可靠的进程管理服务,进程不足时候可以智能扩充数量,闲置时候可以自动回收销毁多余的进程,同时它对程序的容错能力很强大运行非常稳定,可以应付企业级的开发需求。php-fpm友好的完成了使用HTTP/HTTPS等TCP/IP互联网协议下进行的用户的输入输出,页面级生命周期各种资源用完即释放,不存在内存泄漏的问题。php-fpm也提供有一些常驻内存的技术支持,例如PHP 7.4引入的opcache.preload也能实现局部的PHP类和函数的常驻内存,不过这个方法不够灵活,和服务器配置捆绑的太死了。

php-cli因为能实现各类资源的常驻内存,所以可以资源复用,更高效完成多进程编程和异步编程,可以开发出负载能力更高的应用系统。但是相对php-fpm的简单编程开发,开发者要注意很多的事项和需要做很多附加的控制器开发,否则就无法实现期待中的高性能。

首先开发者需要去实现可靠的进程管理服务,保证系统进程遇到各类错误退出运行后能够自动创建新的进程,只有这样才能保证后续的服务请求有足够空闲进程可分配。每个业务代码段都要做异常处理,让进程遇到非致命错误时候不会退出,因为进程重启意味程序和各类资源需要再次加载,这个过程性能消耗不小,所以只有进程稳定运行了常驻内存才有意义。

其次因为常驻内存,编写的新的程序必须重启服务才能生效,这一点习惯了fpm模式的开发者会感到比较陌生。另外开发者需要手工释放内存,否则系统长时间运行后会出现内存泄露。同时在cli模式下,我们不能像fpm里直接用 $_SERVER、$_POST、$_GET、$_COOKI和$_FILES 进行编程工作,需要自己去解析各种互联网通讯协议完成用户的输入输出。要实现多进程编程利用多核CPU计算,还有学习使用pcntl和posix编程,这里涉及到了异步编程逻辑,这块难度还是比较大的。比较常用的模式是结合swoole 组件编写cli框架。

PHP是一个活跃的社区开发语言,有专业的核心开发团队在持续不断的迭代,最近一个版本就是PHP 8.0.8 引入了很多的新特性。

php程序员面试题目和答案(精选篇3)

1、不准备经历方面的问题

一定要多花时间回忆你过去的相关经历,包括你参与的项目,你遇到的各种困难,以及如何解决的这些难题。你的回答会影响面试官对你技术能力的印象,所以一定要回顾和整理一下你过去的项目经历。

2、依赖于事先背诵的答案

试图通过事先背诵一些答案,然后在面试派上用场是一个非常不好的方法。首先,恰好能用上你背的答案的概率微乎其微,其次,这样的准备会花费你大量的时间和精力,而没有真正能力上的提高。记住,你在现场发挥的越好、越真实,你身上的价值就越高。

3、缺乏对面试的模拟

这是很显然的,做很多事情前你都要准备和模拟一下,防止意外的情况发生。PHP程序员面试也是一样的,如果你正在准备一个PHP程序员面试,你应该找一些可以和你一起准备的PHP程序员,你们一起模拟面试的场景,互相提问。

4、没有展现思考的过程

如果你在回答问题时很长时间不说话,就会让人理解为你无法解答这个问题。你不提供一个思考的过程,面试官就无法了解你的想法,不知道你是在思考还是被难住了。但是,如果你和面试官一直交谈,他就会了解你的想法,看到你的思维过程,这是很重要的。而且当你的思路有偏差时,面试官还可以引导你回到正确的解决方案中来。

5、写代码离不开编辑器

如果你要参加一个技术型的面试,面试官通常会要求你在白板/白纸上写代码,而不是在电脑上。所以,你不能过度依赖于代码编辑器,因为在那里它会帮你补充代码、显示出你的语法错误等。赶快拿出笔和纸,写下你的代码,当你满意自己在纸上写的程序的时候,再把它输入到电脑,让编译器验证它正确与否。

6、没有养成良好的编程习惯

不要因为你仅仅写了一个可以执行的程序,就以为自己已经做得很好了。你还要注意在程序中有没有重复的代码、混乱的数据结构、过度的空格等等。要像在实际的开发中一样,设计更有逻辑性的数据结构、有更好的框架、代码更整洁和易读。

7、不进行测试

当你的程序写完后,花点时间检查一下你的代码,以确保其中没有bug。如果是在用笔和纸来练习,就要把程序再写到编辑器中,让编译器帮助你检查。

8、总是着急忙慌

在解决问题时不要着急,否则只会导致更多的错误,显得你很粗心。要有条理和准确的的做事,经常回头看看你的代码,如果有错误就改正它们。这样做,其实完成项目的时间会更短,而且错误会更少。

28110