PHP初体验

The elePHPant, PHP mascot.

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) 不区分大小写,可以用TRUEFALSE,也可以用truefalse表示;实际应用中最好统一。
空类型(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语言风格,如下:

类型 操作符 说明
算术运算符 +-*/% -
比较运算符 ==!=><>=<= -
逻辑运算符 andor&&||! 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...ElseIf...ElseIfSwitch, 其语法如下:

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种循环语法:
forwhiledo...whileforeach.

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关键字调用相应类的构造函数进行创建。对象通过->访问公有的类成员函数和类成员变量。

  • 类成员变量和类成员函数没有加访问控制符修饰,默认是公有访问,更多关于访问控制关键字publicprotectedprivate跟其它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、正则表达式等都有良好的支持。

鉴于篇幅有限,更多高级特性以后再另写一篇。

小结

对于一门新语言,仅仅掌握其它语法很容易,但如果没有掌握到该语言的精髓或语言没有对你编程思想的造成影响,那学这门语言还有什么意义呢?

更多参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容