起因

学习和使用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. Git IDEA Move or commit them before merge

    提交代码遇到这个问题. Move or commit them before merge 百度了一下都是在Gitbash 中敲命令. 在团队协作中 你总不能去敲命令吧 后来在组长的怂恿下,我删除了一个 ...

  2. Java并发编程(六)原子性与易变性

    原子性 原子是最小单元.不可再分的意思.原子性是指某个操作在获取CPU时间时,要么就给它足够时间,让这个操作执行完,要么就不执行这个操作,执行时不能出现上下文切换(把CPU时间从一个线程分配到另一个线 ...

  3. js身份证校验

    通过js实现对15位或者18位身份证格式校验: 通过调用idCardNoUtil.checkeIdCardNo(idCardNo)传入身份证号码,实现校验. var idCardNoUtil = { ...

  4. ps加强总结

    快捷键 1.ctrl+alt+z返回 2.ctrl+z撤销 3.ctrl+s保存 4.ctrl+shift+s另存为 5.shift是有序的选择   ctrl键是无序的选择 6.ctrl+g打组   ...

  5. js 里常用的字符串操作方法

    /*var str='啦啦啦'; var str1='哈哈哈' //charAt() 返回指定索引处的字符串 console.log(str.charAt(3)) //charCodeAt() 返回指 ...

  6. 新增时json类型报错

    新增时出错:如下 实体类中字段类型没有对应上,vue页面中修改跳转页面的路径:使用params...

  7. HTML5 -- 浏览器数据缓存 -- indexedDB

    IndexedDB是一种可以让你在用户的浏览器内持久化存储数据的方法,为web应用提供了丰富的查询功能,使我们的应用在在线和离线都能正常工作. 由于 IndexedDB 本身的规范还在持续演进中,当前 ...

  8. Hbase(1)-MySQL海量数据存储的启发

    宽表拆分 有一张user表,记录了用户的信息,,如果表中的列有很多,就称之为宽表,为了提升效率,会进行垂直拆分 拆分后 将用户的信息分为基本信息和其他信息,页面一开打就需要展示的信息为基本信息,其他信 ...

  9. 【一】Spark基础

    Spark基础 什么是spark 也是一个分布式的并行计算框架 spark是下一代的map-reduce,扩展了mr的数据处理流程. Spark架构原理图解 RDD[Resilient Distrib ...

  10. Go语言 异常panic和恢复recover用法

    Go语言 异常panic和恢复recover用法 背景:Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在 ...