PHP学习和使用总结
起因
学习和使用PHP也有不少年头了,而自己也在学习和使用其他许多语言。我想通过这个总结来给自己一个交代。另一方面也分享一下开发经验,如何用PHP开发和管理大型的项目。
闲聊
许多人说自己1天学会PHP,头3天就写了个网站。的确PHP是个上手简单的语言,原因在于:
- 它不需要编译就能运行;这使得你的学习-实践成本很低;
- 它容错很高,使得你的程序总是能先运行,而不是一大堆报错。
- 它的不严谨,书写随意,你觉得应该可以这样写,它就能这样写。
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个内容。
目录
- 入门
- 语法
- web服务器
- 简洁严谨的使用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学习和使用总结的更多相关文章
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Unity3d学习 制作地形
这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
随机推荐
- 用javascript编写地区表单ES6
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- flashback query闪回数据
误删除了部分重要数据,已提交,需要恢复.首先尝试flashback query闪回数据. 数据库运行在归档模式,首先确认数据库的SCN的变化: SQL> col fscn for 9999999 ...
- iOS:文字相关(19-01-08更)
0.写在前面 1.小技巧 UILabel类: 1-1-1).设置行间距富文本,有省略号要求的,需要再次设置省略(初始化时设置的会失效). UITextField类: 1-2-1).清空按钮. UITe ...
- React Native封装Toast与加载Loading组件
React Native开发封装Toast与加载Loading组件 在App开发中,我们避免不了使用的两个组件,一个Toast,一个网络加载Loading,在RN开发中,也是一样,React Nati ...
- iOS-Cordova集成开发,已有项目集成cordova
iOS-Cordova集成开发,已有项目集成cordova 项目组准备开发一个APP,要求Android和iOS端页面完全一致,除了一个页面跟业务相关的不同,其他界面基本一致,因此,萌生一个想法,关于 ...
- BUAA_OO第二单元总结性博客作业——多线程电梯架构
一.设计策略 在第一次作业时,我刚第一次接触多线程这个东西……于是乎对于第一次VIP直上直下一次只接一个人的电梯,我借鉴了指导书中为我们提供的架构,设计了一个输入线程和一个电梯线程,并设置了一个中间类 ...
- emlog 百度熊掌号提交插件-基于Emlog6.0.1特别版美化
插件截图 插件简介 此插件在发布文章的时候自动向百度熊掌号提交,有利于百度熊掌号收录.基于Emlog6.0.1特别版美化的插件. 在百度推送插件的基础上修改制作而成与百度推送共存,解放双手,走向人生巅 ...
- 最新学习springboot 配置注解
一.概述 Spring Boot设计目的是用来简化新Spring应用的初始搭建以及开发过程.Spring Boot并不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式. ...
- ios中input输入无效
项目中一个登陆界面的input在安卓下可以输入,iOS下无法输入,经查询为 设置了-webkit-user-select:none;将其改为-webkit-user-select:auto;修正. 参 ...
- laravel Eloquent ORM联合查询出现Class not found,就算在Moel中存在这个类
今天发现一个坑,在处理Eloquent ORM的联合查询时,一直报错Class 'AdminGroup' not found ,可是我的项目中明明存在这个类,如下 这是我的模型类: 它们的控制器方法: ...