技术视野对程序员有多重要

2006年到2008年,当时在武汉的我犹如坐井观天,只知道.net和java。
这两者都是商业世界的产物,被极力推广,泛滥成灾。
我当时对这两种语言都无爱,感觉太繁琐,繁文缛节一大堆。
2009年,我偶然在《南方周末》头版中看到招聘lamp架构工程师的信息。
感觉很新奇,回去一搜,才发现,lamp架构已经风靡全球,
只是因为我们学校师资落后,信息闭塞,没人会用,导致我们都不知道而已。
我瞬间被这开源世界的产物吸引了,多种技术组合在一起,形成一个整体,没有鸡肋。
当时我还没接触过linux,所以最开始用张宴老师提供的wamp套件,
在windows上成功搭建起wamp架构,
开始尝试写一些php脚本和mysql语句,在网上看一些教程。

定义变量和常量

php是一门在服务器端运行的弱类型动态语言;
它使用$来声明一个变量,$后紧跟变量名,注意中间没有空格,类似$name。
当你在程序中要访问这个变量时,必须用$name,而不能用name。
它使用define(key,value)来声明并定义一个常量,访问这个常量直接用key就可以。
从这里你能看出:语言设计者在设计变量和常量时采用了截然不同的哲学。
你能明显看出用$声明变量来自一门语言,用define()声明常量来自另一门语言。

<?php
define('type','brand');
echo type;
$name = 'michael';
echo $name;
<?>

js是一门在浏览器端运行的弱类型动态语言:
它使用var来声明一个变量,var后是变量名,注意中间一定要有空格,类似var name。
当你在程序中要访问这个变量时,直接用name即可。

<script>
var name = 'brand';
alert(name);
</script>

js中是没有常量的定义的,它认为一切都是变量。
当你定义了一个变量但此后却没有改变它的值,那这个变量就是常量。
当你定义了一个变量但此后却改变了它的值,那这个变量还是变量。
也就说在js中常量和变量是相互转化的,完全取决你怎么操作。
我个人是非常喜欢这种自由度超高的设计的。
有人担心自由度太高会引来混乱而建议引入const关键字来定义常量。

<script>
const type = 'brand';
alert(type);
</script>

这已经在现代浏览器成为现实。

操作数组

现在有一个任务:定义一个数组,push一个值,计算数组的长度。

<?php
$cars=array("Volvo","BMW","SAAB");
array_push($cars,'Telsa');
echo count($cars);
<?>
<script>
var cars=["Volvo","BMW","SAAB"];
cars.push('Telsa');
alert(cars.length)
</script>

让我们再来看一下作用域:

<?php
$x = 5; //global scope
function test(){
$y =10; //local scope
echo $y; //success
echo $x; //failure
}
test();
echo $y; //failure
echo $x; //success
<?>
<script>
var x = 5; //glocal scope
function test(){
var y = 10; //local scope
alert(y); //success
alert(x); //success
}
test();
alert(y); //failure
alert(x); //success
</script>

     js的作用域非常好理解:函数里可以访问函数外的变量,但函数外访问不了函数里的变量。
php的作用域非常难理解:函数里不能访问函数外的变量,函数外也访问不了函数里的变量。
这个地方非常费解:全局作用域的变量居然在函数里访问不了,这还叫全局作用域?
php引入一个关键字用于在函数内访问全局变量,那就是:global。

<?php
$x = 5; //global scope
$y =10; //global scope
function test(){
global $x,$y;
$z = $x + $y;
echo $z; //15
}
test()
<?>

简单理解:
全局作用域的变量可以在文件中任意位置访问,但就是不能在函数内访问。
如果要想在函数内访问全局作用域的变量,必须在函数内用global显式声明这个变量。
这个设计得有多蛋疼!

数据格式

php操作mysql返回的数据格式并不是我们想用的json,
php5.2以后才支持json,每次必须json_encode()下。
前后端开发协作中,大家默认用json方式来传输数据。
但这只是理想情况,
我有好几次遇到数据格式问题,从network看确实取到了数据,数据内容也对。
但就是解释不成功,用断点调试也看不出来区别。
因为在断点调试中数据没有格式化,json和字符串看起来一模一样。
最后用typeof(data),发现返回的数据是字符串格式。
你必须得JSON.parse(data),把字符串格式的数据转化为json格式。
如果你遇到不负责任的后端,丢给你一个字符串,你又不明白这其中的奥妙,
那估计够你折腾了。
所以说统一数据格式有多么重要。

设计思想

从代码风格来把两者做个对比:

PHP $cars=array("Volvo","BMW","SAAB"); array_push($cars,'Telsa');
JS var cars=["Volvo","BMW","SAAB"]; cars.push('Telsa');

前者是方法(对象,参数),后者是对象.方法(参数)
从语言设计本身来看PHP是典型的面向过程语言,在PHP5.0版本后也引入了面向对象部分。
而JavaScript是集面向过程、面向对象、函数式编程于一身,自由度极高,像风一样自由。