起因

学习和使用PHP也有不少年头了,而自己也在学习和使用其他许多语言。我想通过这个总结来给自己一个交代。另一方面也分享一下开发经验,如何用PHP开发和管理大型的项目。

闲聊

许多人说自己1天学会PHP,头3天就写了个网站。的确PHP是个上手简单的语言,原因在于:

  1. 它不需要编译就能运行;这使得你的学习-实践成本很低;
  2. 它容错很高,使得你的程序总是能先运行,而不是一大堆报错。
  3. 它的不严谨,书写随意,你觉得应该可以这样写,它就能这样写。

PHP最初的目的是为了做一个个人网站,非常快,非常简单。所以到了今天,PHP还是包含了大量的早期为了简单起见保留的语法。比如,你不需要定义任何函数就能执行PHP,这一点和shell,perl是一样的;PHP在设计时没少参考服务器的脚本语言。

PHP的简单也招来很多歧视,这些歧视不是没有道理,但是我想说的是,还好他们没有在写PHP了。一个项目是否严谨且符合工程标准,需要开发团队极强的自我约束能力,否则就算是用严谨而简洁著称Python,也能写出很烂的项目代码。

PHP发展至今,已经包含了命名空间,类,方法,函数,反射,异常处理,协程,异步IO等等复杂的实现;这使得PHP能够像比如JAVA一样应对大型web项目。而PHP 7编译完成的脚本执行速度已经快要达到HHVM的速度了。

公平的说,PHP还有很多短板(2017年1月10日),比如多线程和异步编程依旧很不成熟。缺乏权威的包管理体系,以至于社区贡献的公共库不多,比如和java比是少的多,为了兼顾性能,许多扩展包都是用C语言写的,使得扩展的开发成本不低,安装也复杂。那同样是脚本语言的Python,怎么没有干掉PHP呢?一个是历史原因,很多项目已经是PHP了。一个是Python在从2.* 跨域到 3.*的尴尬情况。虽然Python已经有超越PHP的占有率,但是国内Web开发领域,用Python的貌似不多。包括我自己用Python还是在服务器管理、数据统计等方面,少有用于网站开发。个人感觉Python开发网站还是不如PHP来得方便。


正文

这份总结也可以当做一份教程使用。但是起码需要C语言的程序基础,因为不会包含如何使用条件语句或者循环体这样的东西。大概是下面3个内容。

目录

  1. 入门
  2. 语法
  3. web服务器
  4. 简洁严谨的使用PHP
    • 项目、框架
    • 规范
    • 技巧

## 1. 入门
这里假设你有过任意一种编程语言的经验了。

1.1 怎么运行PHP

如果你对Linux 或 Unix(MacOS比如)熟悉,那么恭喜你,运行PHP的方法和shell脚本完全相同:

首先你创建一个文本文件,里面随便写个字符串,比如"Hello world",注意,随便写就是其字面意思,不要关心语法什么的。就像用记事本写个文本文件那样。

然后

$ php index.php

或者在脚本顶部加上 #!/usr/bin/env php ,然后

$ chmod +x index.php
$ ./index.php

就可以看到输出了Hello world。

那么问题来了,windows下如何运行PHP,linux 或 MacOS下,PHP从哪来?总得安装吧。

1.2 安装

1.2.1 windows:

Windows 下PHP安装就是一个复制粘贴的过程,在php.net的官网上找到Windows的版本,下载,解压之后,得到的目录中的 bin/php.exe 就是php了。在cmd命令行下执行

/path/to/php/bin/php.exe index.php

可以运行刚才的脚本。

1.2.2 Linux 使用包管理安装:

redhat 或 Centos下用yum install php 可能遇到php版本不是最新的问题。所以这里强烈建议用源码安装最新稳定版本。

如果你正在使用MacOS,PHP默认是有安装的,版本一般还凑合,特别是有经常升级系统,应该还是挺新的,如果要安装其他版本,那么可以使用brew install来安装PHP。brew 工具可自己Google一下。

1.2.3 Linux、MacOS 编译安装:

MacOS的gcc编译器是XCode提供的,所以编译之前,你得先安装XCode。其他linux环境只要不是太旧,应该没有问题。可以在官网查看编译要求。

# 在MacOS下面你可能遇到大量的头文件不存在的问题。安装完xcode后,还需要执行下面指令,即使这样,还可能继续遇到/usr下权限问题。。。请多多google
xcode-select --install

然后到官网下载稳定版本的php安装包,比如现在是PHP 5.6.* 或者 PHP 7。你可能好奇PHP 6呢,流产了,据说是社区贡献的代码质量问题和管理问题导致。

下载好的代码包安装过程和其他Linux下源码安装方式一样:

# 解压并安装
tar zxf php.*.tar.gz
cd php.*
./configure
make && make install

新版MacOS可能遇到/usr/include文件夹不存在,可Google解决。不过你可以考虑使用系统自带的PHP。

如何验证安装?执行指令 php -v 可看到php的版本信息。如果有,就是安装成了。

1.2.4 选择IDE

早期我们学习PHP的同学都喜欢文本编辑器,比如nodepad++,vim。。。不过现在有更好的选择。喜欢自己捣腾的还是可以选择VIM或者Sublime也不错。如果要一个完整的、现成的IDE,最好的是PHPStorm,但是这个要钱,不过盗版横行。。。如果用其他IDE,我觉得还不如用Sublime,顺便还多学个Python,而且不强制收费。

1.2.4 如何使用IDE运行PHP脚本?

待补充

## 2 语法

2.1 先学习例子

刚才说在文本文件index.php中随便写一个字符串,不要考虑语法,就这一点来,PHP比shell上手都简单,因为在shell中这么干,得报错(Hello: command not found)。我可以这么做原因是,如果要执行一段PHP代码,需要用<?php [代码内容] ?> 将代码包裹起来,比如下面这样:

<?php
//PHP每个完整表达式,函数调用,都应该以;结尾,但是表达式,或者函数调用中间可以换行
echo "Hello world";
?>

而其他部分,PHP会跳过直接输出。如果你熟悉JSP 或者 ASP,这是一样的,在JSP中你可以用<% [java 代码] %>。而上面的代码还有一种更加简洁的书写方式:

这是一种输出内容的时候的一种简写方式,省略了echo 语法和 php 关键字,还有一个分号也不写了。
<?="Hello world"?>

这里你可能好奇,php没有函数吗?一般语言执行的不应该起码是个函数吗?比如C语言的print("Hello World")?echo确实不是函数,是一个语法,就像C语言中声明一个变量:

//这里也没有括号,int也不是函数
int age;

所以echo不具备作为函数的一些特质,但是多了一些语法的功能,比如输出多个值可以

<?php
echo "hello","world"; //如果一个php文件全部是php代码,结尾的?>不要写,目前先记着就行,为啥不写可以Google一下。

2.2 变量、函数、类

2.2.1 变量

任何一个PHP变量都是以$开头,这个没有例外,变量名包含字母数字下划线和“unicode字符(这个玩玩就好,不要用它)”,和C一样,不能数字开头,区分大小写。

<?php
//php定义变量不需要事先声明 $name = "kevin";//字符串
$age = 30;//整数 $name = $age;//弱类型使得你可以这样赋值,但是就像开头说的,你要这么做,PHP不会拒绝,但是你的代码就容易出问题,而且不严谨了 $句子 = $name . " is a man.";//php支持unicode,不过也别这么干,英文命名是最好的选择,拼音都不要用。 echo $句子;
//得到输出:30 is a man.
//这里你可以看到 英文句号 可以连接2个字符串,但是这样也导致了对象不能用.操作了,这也是个历史遗留问题,PHP一开始压根就没考虑过会有对象这回事。

2.2.2 函数

<?php
/**
* 直接来例子最容易理解
*/
function add($a,$b = 1) {
return $a + $b;
} echo add(1,2);
//得到输出:3

上面定义了一个函数add,用于两个数相加,第二个数默认是1,这样如果add($a) 就相当于 $a + 1或者$a++;的功能。PHP函数没有定义返回值,而且要求function开头,因为PHP是弱类型的,返回值是什么类型,它并不关心。调用的人去理解就行了。自从有了面向对象后,函数就不再提倡使用了,所以函数应该多用于及其简单的场景,或者练习中。

2.2.3 类

class Math {
function add($a,$b = 1) {
return $a + $b;
}
} $m = new Math();
echo $m->add(1,2);
//得到输出3

上面定义了一个Math类,包含一个add的公有方法,php的类和java一样,有抽象类,接口,私有方法,保护方法等等,但是先不介绍了(免得1天学不完)。

这里看到,用new 关键字实例化了类,这个各种语言基本一样。用了->符号来调用对象的方法,这问题前面说了,因为句号被占用了,C语言中指向结构体的指针也是用->这个符号来引用成员数据,PHP使用它也算是能够接受。

2.2.4 恭喜你完成了PHP入门

如果你想用PHP写点东西,只需要再有一个函数手册就好了。但是你还有很多疑问,比如怎么把东西递交给用户的浏览器?

## 3 Web服务器
PHP最大的用处就是做网站,在终端里面加加减减,输出点东西,往往是练习或者单元测试,关于PHP单元测试,后面也会介绍。

PHP 最常见的使用组合是和Apache一起,如果你在用MacOS,只要启用个人站点的功能,就是一个完美的PHP + APACHE的服务器环境了。而其他使用Linux和windows的人可能就要麻烦一些,要自己编译和配置。为了简单起见,这里用php-fpm的方式来运行php,而需要的web服务器是:Nginx。

Nginx 安装

待续

PHP学习和使用总结的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  10. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

随机推荐

  1. 【腾讯敏捷转型No.2】帅哥,来多少敏捷?

    上回腾讯敏捷转型系列第一篇文章<敏捷到底是什么鬼?>讲到公司铁了心要推进敏捷,这是战略层面的决定,为什么呢? 当时的我们并不知道公司为什么一定要推行敏捷的新概念,但是后来公司的变化帮助我们 ...

  2. iOS 使约束带动画效果(Animate NSLayoutconstraints)

    http://stackoverflow.com/questions/12926566/are-nslayoutconstraints-animatable http://stackoverflow. ...

  3. iOS笔记,开发经验总结【持续更新】

    1. 设置navigationBar 背景颜色有色差, 原因:如果单纯的设置背景颜色也是有高斯模糊处理的效果,对纯色高斯模糊处理过后相当于纯色的70%(猜测)透明化处理,但是反正就是有色差 解决方法一 ...

  4. paxos协议(1)-朴素paxos

    前言 学习paxos协议,最困惑我的两点是: 1. 朴素paxos是怎么样的?这部分主要是原理: 2. paxos协议是怎么运用到分布式系统解决问题的.因为很多博客的开篇说paxos协议可以运用在很多 ...

  5. JS判断两个数字的大小

    javascript中定义的var类型是弱类型,默认是String类型,在比较两个数字大小的时候默认比较的是两个字符串,比如,在比较10和2时,按数字做比较10是比2大,可是按默认的字符串比较时,第一 ...

  6. Linux基础-3.用户、群组和权限

    1.用户及passwd文件 1)掌握/etc/passwd文件的功能:存储所有用户的相关信息,每一个用户占用一行记录,该文件也被称为用户信息数据库(Database) 2)/etc/passwd文件中 ...

  7. jquery购物车添加功能

    <html> <head> <meta charset="UTF-8"> <title></title> <scr ...

  8. decodeURI、decodeURIComponent 编码方法

    ——摘自<JavaScript高级程序设计> 编码: Global 对象的 encodeURI()和 encodeURIComponent()方法可以对 URI(Uniform Resou ...

  9. 理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO

    以下是IO的一个基本过程 先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间.当用户程序读取数据的时 ...

  10. express添加权限拦截

    express通过中间件的方式添加权限拦截 示例代码如下 app.get('/logout', checkLogin); app.get('/logout', function(req, res) { ...