phper写nodejs走过的坑

PHP是世界上最好的语言。

写了差不多半年的nodejs,本质上还是在被php的惯性影响。谁叫php写了6年多呢。nodejs让我隐藏了笑话中的尴尬:

你们php程序员是不是想钱想疯了,写的代码里面都那么多$

对const的误解

在php的const一旦定义不可以修改,无论是什么变量。但是nodejs不一样

const a = 1; //不可修改
const b = ['1'];//可以对数组中的元素进行添加、修改、删除
b.push('2');

class instance{
}
const c = new instance;
c.id = '';//可以对实例的属性进行操作

所以在nodejs里面被定义了const的变量,只是不能再用=

块作用域

起初对这个块变量了解没有那么深刻,差不多也就是php中局部变量的意思吧,一个简单的例子让我瞬间感受到了区别

function a() {
    for (let i = 0; i < 10; i++) {}
    i; //会报未定义的错误
}
a();

原来这个i只在 for循环中起到了作用。

变量生存周期

php的大多框架一个请求一个进程,所以对于变量的生存周期很容易理解,而且全局变量是请求间隔离的。但是nodejs的全局变量是不隔离的,为了进行对一个请求的变量进行有效隔离,进而有了上下文的概念。

对于php来说,获取当前用户,我们一般的做法可以用单例模式去保存当前用户。然后在使用的是获取当前单例里面的用户即可。
nodejs里面要是像php一样做,在没有并发的情况下,是没有问题的。为什么?
我们知道实现单例要依赖类的静态变量,而类的静态变量不属于实例。而类的静态变量的生存周期是存在是nodejs程序运行的整个生命期间,作为各个请求都可以访问并可以进行改变的。
举个例子:有A、B两个用户同时发起相同的请求。服务器先收到了A的请求,单例里面记录的用户是A,但在请求里面有一个相对较长时间的数据库操作需要等待,而就在这等待的过程中,单例里面记录的用户变成了B,而A请求还没有结束,而最终导致A操作的记录被记录在了B用户之下。

在nodejs里面实现单例模式特别简单

//在A文件里面,然后在其他文件中引用即可。
class A {
}
module.exports = new A;

题外:其实有上下文这个概念的语言都会面临nodejs这个问题,nodejs并不是特例。

你可能感兴趣的:(phper写nodejs走过的坑)