PHP概述
这几天利用零星时间学习了一下PHP,在此做个笔记,供大家参考。在学习一门新语言之前,一般我会先问自己一些问题:
- 为什么会有这门语言?
- 相较于其它语言,这门语言的优势是什么?
- 这门语言主要应用在什么场景?
这些问题在wiki上都有答案,在此做个概述:
PHP是PHP:Hypertext Preprocessor的递归缩写,是一门用于Web开发的服务端脚本语言(server-side scripting language)。最早是由Rasmus Lerdorf在1994年为开发自己个人首页(Personal Home Page,PHP最开始的由来)而创建的,开源得到快速发展,后来由PHP社区维护,重新命名为PHP:Hypertext Preprocessor。
第一行PHP代码
PHP是一门类C语言,如果有C语言基础的话,上手非常容易。下面来看下PHP的Hello World,新建一个文件,全名为hello.php
,写入以下内容:
<?php echo "Hello World!"; ?>
在运行PHP代码之前需要安装PHP运行环境,请参考这里。刚开始学习PHP,可以先不用关心PHP是如何在HTTP server中运行的,可以直接用CLI(command-line interface)执行PHP代码,在shell中执行命令php hello.php
,得到运行结果如下:
是不是很简单?从上面代码中,我们可以得一些信息:为了区别于其它语言,PHP代码需要包含在
<?php
和?>
之间。语法跟C一样,以分号;
结尾;字符串仍然用双引号""
(单引号也可以,后边会讲到)。下面开始学习一下它的简单语法。
PHP语法糖
一般来讲,一门语言的语法糖主要包括:注释、变量、常量、操作符、条件语句、循环语句、函数。
注释
PHP跟C语言一样,支持用//
单行注释、用/* */
进行多行注释,同时也支持python
单行注释的语法#
,如:
// Single line comments
# Single line comments
/*
* Multiple lines comments
* Multiple lines comments
*/
变量
跟C不一样的是,PHP是一门弱类型语言,定义变量的时候并不需要指定类型,需要注意的是,PHP的变量都是以$
符开头,如下:
<?php
$str = "Hello World";
echo $str;
?>
在PHP中,一共有8种变量类型分别是:
类型 | 描述 |
---|---|
整型(Integers) | 有符号的整型,可以用10进制、8进制、16进制表示,如:$int_val = 123;
|
浮点型(Doubles) | 浮点类型, 如:$float_val = 3.1415926;
|
布尔型(Booleans) | 不区分大小写,可以用TRUE 和FALSE ,也可以用true 和false 表示;实际应用中最好统一。 |
空类型(NULL) | 不区别大小写,可以用NULL ,也可以用null 表示,实际应用中最好统一。 |
字符串(Strings) | 可以用单引号'' ,也可以用双引用"" ,其区别是单引号严格展示其内容,双引用,会将展开变量或转义符。 |
列表(Arrays) | 复合类型,可以包含任何其它类型,可以用array() 函数创建,如:$arr_val = array('str1', 'str2', 'str3');
|
对象(Objects) | 程序员自定义的类型,通过class 关键字创建,后边会讲到; |
资源(Resources) | 是一种特殊的对象,用于管理PHP的外部资源,如数据库连接。本质上还是对象。 |
<?php
$int_val = 123456;
$float_val = 3.1415926;
$bool_val = false;
$null_val = null;
$str_val = "123456";
$arr_index_val = array(1, 2, 3, 4, 5, 6);
$arr_kv_val = array(
'key1' => 'val1',
'key2' => 'val2',
'key3' => 'val3',
);
?>
常量
和C语言一样,PHP内置了一些常量,如下:
常量 | 描述 |
---|---|
__LINE__ |
在文件中的当前行 |
__FILE__ |
文件的全路径和文件名 |
__FUNCTION__ |
函数名 |
__CLASS__ |
类名 |
__METHOD__ |
类方法名 |
除了内置常量外,程序也可以通过内建函数define
创建自己的常量,创建之后可以直接引用常量,或用constant
函数获取,如下:
<?php
define("MAXSIZE", 100);
echo MAXSIZE;
echo constant("MAXSIZE"); // same as the previouse line
?>
操作符
操作符完全沿袭C语言风格,如下:
类型 | 操作符 | 说明 |
---|---|---|
算术运算符 |
+ 、 - 、* 、/ 、%
|
- |
比较运算符 |
== 、!= 、> 、 < 、 >= 、<=
|
- |
逻辑运算符 |
and 、or 、&& 、|| 、!
|
and 等同于&& ;or 等同于||
|
赋值运行符 |
= 、+= 、-= 、*= 、/= 、%=
|
- |
条件运行符 | ? : |
If condition is true ? Then value X : Otherwise value Y; |
此外还有++
和--
一元运算符,表示自增1和自减1,如:++$i; --$j
;
另外需要特别说明一下字符串拼接操作符.
,可以非常方便地拼接任何字符串。如:
<?php
$name = "Diego Lee";
echo "Hello ". $name. "\n";
?>
条件语句
条件判断语法跟C也类似,主要包括:If...Else
、If...ElseIf
和Switch
, 其语法如下:
if (condition) {
// code to be executed if condition is true;
}
else {
// code to be executed if condition is false;
}
if (condition) {
// code to be executed if condition is true;
}
else if (condition) {
// code to be executed if condition is true;
}
else {
// code to be executed if condition is false;
}
switch (expression) {
case label1:
// code to be executed if expression = label1;
break;
case label2:
// code to be executed if expression = label2;
break;
default:
// code to be executed if expression is different from both label1 and label2;
break;
}
相较于C语言,PHP的switch
语句中的label可以是字符串;
循环语句
PHP支持4种循环语法:
for
、while
、do...while
、foreach
.
for (initializetion; condiftion; increment) {
// code to be executed;
}
while (condition) {
// code to be executed;
}
do {
// code to be executed;
} while (condition);
foreach (array as value) {
// code to be executed;
}
前三种跟C语言是一样的,对于foreach
的用法如下:
<?php
$arr_val = array(1, 2, 3, 4, 5, 6);
foreach($arr_val as $val) {
echo "$val ";
}
?>
函数
定义一个函数非常简单,需要以function
关键字开头,调用函数和C语言类似,如下:
<?php
function sayHello($name) {
echo "Hello ". $name. "!";
}
$name = "Diego Lee";
sayHello('$name);
?>
对于函数参数,也可以像C++语言一样,可以传递引用:
<?php
function swap(&$a, &$b) {
$temp = $b;
$b = $a;
$a = $temp;
}
$a = "Hello";
$b = "World";
swap($a, $b);
?>
PHP对OO的支持
对于每种语法,都是其支持的编程范式,如果C支持面向过程;C++在C的基础上支持面向对象、泛型编程、模板元编程;Java支持面向对象、元编程...。同样PHP也支持函数式、面向对象、元编程。函数上面提到了,元编程超出本文的范围,面向对象(Object-Oriented
)在实际开发补广泛应用,PHP从C++,Java等语言中吸取了很多特性,对面向对象进行了良好的支持。
封装、继承、多态都是面向对象的一样概念,对应到语言层面,包括类(Class)
、对象(Object)
、成员变量(Member Variable)
、成员函数(Member function)
、继承(Inheritance)
、多态(Polymorphism)
、重载(Overloading)
等。
类
<?php
class Foo {
var $name;
private $inner;
function __construct($name, $inner) {
$this->name = $name;
$this->inner = $inner;
}
function __destruct() {
// release resources
}
function setName($name) {
$this->name= $name;
}
function getName() {
return $this->name;
}
protected function �setInner($inner) {
$this->inner = $inner;
}
protected function getInner() {
return $inner;
}
}
$foo = new Foo("Baba");
echo $foo->getName();
echo $foo->name;
?>
类通过关键字
class
声明,成员变量声明需要在前加var
,如果有访问控制符,就不需要再加var
修饰了。每个对象都有一个$this指定,用于访问对象自身的成员变量或成员函数。成员函数定义跟普通函数定义类似,只不过是包含在类作用域中。有两个特殊的成员函数构造函数和析构函数,分别用
__construct
和__destruct
来定义,构造函数可以带不同类型参数,析构函数用于释放一些资源对象。对象创建通过
new
关键字调用相应类的构造函数进行创建。对象通过->
访问公有的类成员函数和类成员变量。类成员变量和类成员函数没有加访问控制符修饰,默认是公有访问,更多关于访问控制关键字
public
、protected
、private
跟其它OO语言(C++
、Java
等)类似。
抽象类 & 继承
<?php
abstract class Shape {
public abstract function draw();
}
class Circle extends Shape {
public function draw() {
echo "Circle draw.\n";
}
}
class Triangle extends Shape {
public function draw() {
echo "Triangle draw.\n";
}
}
$shapes = array(new Circle(), new Triangle());
foreach ($shapes as $shape) {
$shape->draw();
}
?>
- 继承通过关键字
extends
实现; - 抽象类或抽象方法通过关键字
abstract
实现,抽象类不能实例化,必须被继承; - 子类可以重写(
override
)父类的抽象方法,不同子类调用父类相同方法,表现不同,为多态(Polymorphism
);
接口 & 实现
<?php
interface Shape {
public function draw();
}
class Circle implements Shape {
public function draw() {
echo "Circle draw.\n";
}
}
class Triangle implements Shape {
public function draw() {
echo "Triangle draw.\n";
}
}
$shapes = array(new Circle(), new Triangle());
foreach ($shapes as $shape) {
$shape->draw();
}
?>
- 接口通过关键字
interface
实现,接口相当于定义了一个框架结构,不同的实现类根据接口规范实现不同的功能; - 类实现接口通过关键字
implements
实现;
其它关键字
关键字 | 说明 |
---|---|
const |
修饰成员变量,表示成员变量是不可修改的 |
static |
修复成员变量或成员函数,表示该成员变量或成员函数并不属于某个类对象,只能通过类名访问(如果有public访问权限的话) |
final |
修饰成员函数,用于阻止子类重写该成员函数 |
更多高级特性
有了上面的基础知识,就可以开始上手开发程序了。但上面的特性都是从其它语言中借鉴来的,并没有体现出PHP的优势。PHP更强大的地方在于,其做为服务端语言,能够和绝大多数HTTP server无缝结合。
PHP内置了很多预定义的变量,可以方便的处理HTTP请求;另外PHP对各种数据库、AJAX、XML、正则表达式等都有良好的支持。
鉴于篇幅有限,更多高级特性以后再另写一篇。
小结
对于一门新语言,仅仅掌握其它语法很容易,但如果没有掌握到该语言的精髓或语言没有对你编程思想的造成影响,那学这门语言还有什么意义呢?