用Kotlin改写PHP程序是什么样的体验

简介: 学Kotlin其实要看:http://kotlinlang.org/docs/kotlin-docs.pdf在线版是不完整的!!!少了一些章节,会有点难看懂后面的文档。我选择了WordPress里的错误消息管理类wp-error.php为对象,没有依赖其他具体场景和类,所以比较适合移植和对比。

学Kotlin其实要看:http://kotlinlang.org/docs/kotlin-docs.pdf

在线版是不完整的!!!少了一些章节,会有点难看懂后面的文档。

我选择了WordPress里的错误消息管理类wp-error.php为对象,没有依赖其他具体场景和类,所以比较适合移植和对比。

代码是前几天整理的,为了便于在线查看,把它贴到Git上了。代码查看地址:http://git.oschina.net/web3d/kotpress/blob/master/Error.kt

为了简化逻辑,将Error类中要保存的data、code全部设定为String类型。

基础知识

1.语感

上帝说,要有光,从此就有光了;奥巴马说,编程语言是门外语,从此,我们也是精通多种外语的人啦。

Kotlin从代码的语感上,是有着python的风格的,像:

if (obj is String)  return obj.length

if (x in 1..y - 1) println("OK")

是不是很接近英文原生语句?

2.变量

局部变量分为可变变量和不变变量,分别用 var(variable) 和 val(?)来声明。

variable

内存中的变量初始化,一般要经过两步,声明变量类型、开辟内存空间;赋值初始化。

var y: Int;
y = 10;

目前多数语言的写法,都是一句话完成这两步。

var y: Int = 10;

而Kotlin中更简洁的写法是:

var y = 10;

y 被赋值时,会被自动推断(inferred)为整型Int,这种写法有点亲切感了。

注:类型自动推断是强静态类型语言范围的一种特性。自动推断类型的能力让很多编程任务变得容易,让程序员可以忽略类型标注的同时仍然允许类型检查。类型推导不是Go语言首创,但是现代语言中,Go中运用广泛,Kotlin也引入了这种特性。

Kotlin是静态类型的,如果想将y重新赋值为其它类型如字符串是不行的:

y = "13"

Val

val 基本特性和用法与var相同,但有点类似我们一般语言中常量的概念:被初始化赋值一次后,不能再重新赋值;与常量不同的是,它可以作为局部变量。如:

val y = 10

如果继续在后面:

y = 12

编译器就会报错。

当然,不能重新赋值不是说变量所代表的对象包含的值不能变,下文的数组对象array,同样是通过val声明的,但它里面包含的值是可以继续操作的。

刚从PHP转过来的话,应该还有点适应不了:要熟悉和记忆各种数据类型和集合类型;每次声明一个变量,还要想这个变量是否可变,太烧脑了。但这就是一种更朴实的思维方式,前面多想想,后面的代码就会更可靠,不会因为一些意外的操作造成数据的值或类型被破坏。

类的普通属性应该都用 var 来声明,因为可能要在某个方法中将另一个对象赋给它;但局部变量应当尽可能用val。

3.类型推导

Java里面定义一个字符串类型的一维数组列表要这样写:

ArrayList<String> array = new ArrayList<String>();

Kotlin里面:

Kotlin可与Java互通,所以,它也可以写成类似上面的形式:

val array: ArrayList<String> = ArrayList<String>();//没有new关键词
array.add("abc")

但Kotlin风格的写法为:

val array = arrayListOf<String>();

array.add("abc")

PHP里面:

$array = [];
$array[] = 'abc';

4.this

和Java一样,Kotlin中大多数时候,this可以省略,这是现代编程语言都支持的特性。

像PHP、Python这种都需要有个指代对象去访问。

5.empty/Blank

再牛掰的语言,可能也解决不了空字符串的问题;一个字符串对象就是可以包含空字符串、或者可能含有多个空格的字符串。但逻辑上,他们是无效的数据!所以几乎每个有字符串的地方,可能都要判断一下,尤其是做键名等名称标识的场景。

WordPress这个Error类就是典型场景。错误消息是按错误代码 => 错误消息 的格式存储的,如果以空字符串为键名,它到底代表什么含义,无法明确得知。所以我们就要判断是否为empty,但php里的empty判断在这真正有用吗,如果这个键名里包含的字符全是空格呢?所以像Java和Kotlin中的String对象除了isEmtpy()方法外都会有个isBlank()的判断。

但在演示代码中,我反复斟酌后,还是去掉了相关判断,因为几乎这个类每个方法里都得加,这样没有美感,不科学。

6.句尾分号可省略

单行语句多数情况可以省略分号

7.烧脑的Exception

PHP中,我们还没有养成抛出异常、然后捕捉异常的编程习惯。一般都是通过多种返回值类型或范围去判断结果,是成功还是失败、正常还是异常。到了Kotlin这类静态类型语言中,方法返回值也是需要一种确定的类型,那么失败或异常就只能通过抛出异常的方式去做了。异常的捕捉如果不到位的话,就很容易出现不健壮的体验,动不动的崩溃了。

目录
相关文章
|
1月前
|
缓存 PHP 数据库
PHP程序性能优化指南
在当今互联网快速发展的时代,PHP作为一种流行的服务器端脚本语言,其性能优化显得尤为重要。本文将介绍一些提升PHP程序性能的有效方法,帮助开发者更好地优化他们的代码,提升应用程序的响应速度和效率。
|
3月前
|
PHP
HYBBS 表白墙网站PHP程序源码 可封装成APP
HYBBS 表白墙网站PHP程序源码 可封装成APP
33 1
|
PHP
php : 无法将“php”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
php : 无法将“php”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
1812 0
php : 无法将“php”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
|
9月前
|
SQL JSON 关系型数据库
php执行语句在MySQL批量插入大数据量的解决方案及计算程序执行时间(大数据量、MySQL语句优化)
php执行语句在MySQL批量插入大数据量的解决方案及计算程序执行时间(大数据量、MySQL语句优化)
197 1
|
9月前
|
存储 JSON 供应链
使用PHP构建区块链应用程序
区块链技术作为一种去中心化的分布式账本系统,已经引起了广泛的关注。它具有安全、透明、可追溯等特点,被广泛应用于加密货币、供应链管理、身份验证等领域。本文将介绍如何使用PHP构建一个简单的区块链应用程序,并提供相应的代码实现、运行结果和解读。
139 0
|
10月前
|
安全 程序员 网络安全
PHP 恶意程序简单分析
PHP 恶意程序简单分析
82 0
|
10月前
|
自然语言处理 前端开发 小程序
淘宝代购系统;海外代购系统;代购程序,代购系统源码PHP前端源码
代购业务近年兴起的一种购物模式,是帮国外客户购买中国商品。主要通过外贸代购模式,把淘宝、 天猫等电商平台的全站商品通过API接入到你的网站上,瞬间就可以架设一个有数亿产品的大型网上商城,而且可以 把这些中文的商品全部自动翻译成各国语言,能让国外客户看懂,直接在网站上下单,然后网站运营方代为购买再邮
|
应用服务中间件 Linux PHP
xdebug3+php8.0+vscode断点调试php程序
xdebug3+php8.0+vscode断点调试php程序
358 0