起因

学习和使用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. C#实体更新指定的字段

    接口类: /// <summary> /// 更新指定字段 /// </summary> /// <param name="entity">实体 ...

  2. pycharm多行注释

    选中需要注释的代码 ctrl+/ #首字母大写# test = 'alex'# v = test.capitalize()# print (v)## 字符串的加法# n1 = 'my '# n2 = ...

  3. yyy loves Maths VII(状压DP)

    题目背景 yyy对某些数字有着情有独钟的喜爱,他叫他们为幸运数字;然而他作死太多,所以把自己讨厌的数字成为"厄运数字" 题目描述 一群同学在和yyy玩一个游戏 每次,他们会给yyy ...

  4. macOS,安装+配置+激活:MySQL8.0 + Navicat Premium12

    作者的电脑是10.13.3,些许配置偏差请自行略过 本文是学习探讨途径,请勿滥用,后果自负 MySQL8.0 篇章 官网http://www.mysql.com/downloads/ 下载即可,无需激 ...

  5. Java面试题整理2

    多线程部分 并行和并发的区别? 并行指两个或多个事件同一时刻发生:并发指两个或多个事件同一时间间隔发生. 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件. 线程和进程的区别? 进程是程序运 ...

  6. WebGl 平移(矩阵变换)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 获取vue路由跳转路径

    平时BUG: 在vue中使用element ui 中的导航组件时,使用index作为跳转的路径,单击跳转没有问题,但是当刷新页面是,选项卡的激活 状态就变成初始化的了,起起初想到用获取window.l ...

  8. MongoDB DBA 实践6-----MongoDB的分片集群部署

    一.分片 MongoDB使用分片技术来支持大数据集和高吞吐量操作. 1.分片目的 对于单台数据库服务器,庞大的数据量及高吞吐量的应用程序对它而言无疑是个巨大的挑战.频繁的CRUD操作能够耗尽服务器的C ...

  9. Rabbitmq(三)

    1.在服务器安装好rabbitmq后,自己配置自己用的vhost,exchange和queue的绑定 2.项目添加RabbitMqClient.dll(nuget获取)引用 3.添加helper就可以 ...

  10. laravel5.5源码笔记(三、门面类facade)

    上次说了provider,那么这次来说说facade 首先是启动的源头,从laravel的kernel类中的$bootstrappers 数组,我们可以看到它的一些系统引导方法,其中的Register ...