我的主攻是C, C++,之前也学过 Python, Lua 脚本语言,没有接触过PHP。这几天在学习PHP,做个笔记。
感觉PHP在语法上与C++特别相似。只要会C++,PHP基本上不用记什么。
语法上有这些特点:
1. 数据类型
null, bool, string, float, integer, array, object
object 是 new 出来的对象
转换类型与 C 一样。
2. PHP里所有的变量名都是以 $ 开头
在Shell里,只有获取变量的时候才需要加$符号,在PHP里,所获取还是设置都要加 $ 符号
$str = "hello";
echo $str;
3. PHP里变量名区分大小写,函数名不分
$str = "String\n";
$STR = "This is STR\n";
echo $str;
ECho $str;
echo $STR;
结果输出:
String
String
This is STR
4. PHP里的注释除了C++有的 // /**/ 外,还有脚本常用的 #
// 注释
/*
* 注释
*/
# 注释
5. 定义变量时无需指明类型
这点与 python, lua一样,这也是大多数据脚本的共性。
6. 数据组是 array
用作数组时:
$arr = array("C++", "C", "Java", "PHP");
$map = array("John"=>"M", "Lily"=>"F");
如果不指定键值,那么它就是数字 0,1,2,3...为键。如果指定了键值,那就以指定的键值为键。
其功能非常类似于Lua的表。Lua的如下:
w = {x=0, y=0, label="console"}
不过 Lua 的有点怪异,非得从1开始计数。
7. 逻辑语句与C++一样
if .. else if .. else, for, while, continue, break等与C++一样。只不过,PHP还支持用 : ... endXXX 来代替 { ... }
if ($num == 0) {
echo "num = " . $num;
}
# 也可以写成如下
if ($num == 0) :
echo "num = " . $num;
endif
有 ++$i 与 $i++,与C++一样。
8. 字符串用 . 进行连接
这一点跟 Lua 类似,Lua 是用 .. 进行字符串拼接的。
9. 字符串用单引号或双引号界定
$name = 'Peter';
echo 'My name is $name\n';
echo "My name is $name\n";
echo "===="
My name is $name\nMy name is Peter
====
在单引号里 $name 与 \n 都没有被重新计算。而双引号则会被替代。这点跟shell一样。
10. 有 === (恒等)与 !== (不恒等)比较。恒等的意思是不仅值相等,类型还一样
11. 函数的定义
function PrintName($name = "Unknow") {
if (is_string($name)) {
echo "My name is $name\n";
return TRUE;
}
return FALSE;
}
PrintName("Hevake");
与 Lua 类似,也可以带默认值
12. 常量
define("NAME", "hevake_lcj"); # 定义常量
echo constant("name"); # 取常量
if (defined("name")) { # 检查是否定义了常量 name
echo "定义了 name";
}
13. 可变变量
<?php
$text="My Name";
$a = "text";
echo $$a;
echo '<br>';
$b = 'a';
echo $$$b;
?>
$text, $$a, $$$b的结果都是“My Name”。
函数也可以这样引用:
<?php
function come() {
echo "I am coming. <br/>";
}
function back() {
echo "I am back. <br/>";
}
$func = "come";
$func();
$func = "back";
$func();
?>
14. 预定义环境变量
$_SERVER, $_COOKIE, $_SESSION, $_POST, $_GET, $GLOBALS
15. 函数可以以引用传参
<?php
function example(&$m) {
$m = $m * 5 + 10;
}
$m = 1;
example($m);
echo "<p>在函数外:\$m = $m</p>";
?>
16. foreach循环
<?php
$map = array('john'=>18, 'licy'=>22);
foreach ($map as $key=>$value) {
echo "$key=>$value, ";
}
echo '<br/>';
?>
17. 面向对象与Java类似
<?
#示例学生类
class Student
{
#构造函数,没有指定public, protected, private,默认为public
function __construct($Name = "Unknow", $Age = 0)
{
$this->mID = static::$sCount++; #注意静态成员的引用方法
echo "Student $this->mID construct<br/>";
$this->mName = $Name; #注意:是$this->mName,而不是$this->$mName
$this->mAge = $Age;
}
function __destruct()
{
echo "Student $this->mID destruct<br/>";
}
function __clone()
{
$this->mID = static::$sCount++;
echo "Student $this->mID cloned.<br/>";
}
function __get($name)
{
if ($name == 'Name') {
return $mName;
} else if ($name == 'Age') {
return $mAge;
} else {
return null;
}
}
function __set($name, $value)
{
if ($name == 'Name') {
if (is_string($value)) {
$this->mName = $value;
}
} else if ($name == 'Age') {
if (is_int($value)) {
$this->mAge = $value;
}
} else {
throw new Exception("No attribute $name");
}
}
function __ToString()
{
$ret = '<hr/>Class: ' . __CLASS__ . '<br/>' .
"\tName: " . $this->mName . '<br/>' .
"\tAge: " . $this->mAge . '<br/><hr/>';
return $ret;
}
static private $sCount = 0;
private $mID;
private $mName;
private $mAge;
}
function foo($s) {
$s->Age = 30;
}
$s = new Student(); #实例化对象要加new,这不像Python,否则就被当成Student()函数了。
#在构造的过程中,Student::__construct()会被自动调用
$s->Name = "John";
try {
$s->Sex = "male"; #Student并没有Sex属性,会抛异常
} catch (Exception $e) {
echo 'Exception occur!!<br/>';
echo $e;
}
foo($s); /*将对象作为实参传给函数时,其实转的是这个对象的句柄,就像传的是指针一样。
在foo()中对$s对象的修改是有效的*/
echo $s; #自动调用Student::__toString()
$s1 = clone $s; //clone对象
unset($s);
$s1->Name = "LiChunjun";
echo $s1;
?>
可以重定义如下关键函数:
__get($name) 属性获取函数,$name为属性名
__set($name, $value) 属性设置函数
__construct() 构造函数
__destruct() 析构函数
__call($name, $params) 调用函数
__autoload() 类定义加载回调函数
__tostring() 转换字符串函数