PHP2:语法结构
数值与字符串
整数,实数,字符串
PHP浮点数的取值范围和C语言的DOUBLE双精相同,如果浮点数不到10E16,而且没有小数部分,则显示时会按整型的样子显示出来。这时要注意,它的内部是浮点型而不是整型。
小数表示法:888.8
字符串:单引号串,双引号串,反引号串,转移字符(""双引号,""反斜线,"n换行,"tTAB)
echo "path=$PATH"; 这时候会输出当前文件的路径即环境变量
echo 'path=$PATH'; 这时候会输也这个字符串
反引号:引号内得是命令
常量和变量
系统常量:
__FILE__这个默认常量是 PHP 程序文件名。若引用文件 (include 或 require)则在引用文件内的该常量为引用文件名,而不是引用它的文件名。
__LINE__这个默认常量是 PHP 程序行数。若引用文件 (include 或 require)则在引用文件内的该常量为引用文件的行,而不是引用它的文件行。
PHP_VERSION这个内建常量是 PHP 程序的版本,如 '3.0.8-dev'。
PHP_OS这个内建常量指执行 PHP 解析器的操作系统名称,如 'Linux'。
TRUE这个常量就是真值 (true)。
FALSE这个常量就是伪值 (false)。
E_ERROR这个常量指到最近的错误处。
E_WARNING这个常量指到最近的警告处。
E_PARSE本常式为解析语法有潜在问题处。
E_NOTICE这个常式为发生不寻常但不一定是错误处。例如存取一个不存在的变量。
这些 E_ 开头形式的常量,可以参考 error_reporting() 函数,有更多的相关说明。
当然在程序写作时,以上的默认常量是不够用。define() 的功能可以让我们自行定义所需要的常量。见下例
<?php
define("COPYRIGHT", "Copyright © 2000, netleader.126.com");
echo COPYRIGHT;
?>
.....
自定义常量:
define("definename","VALUE");
变量类型:
interger,duble,string,array,object,boolean(1true,0false)
变量使用:
严格区分大小写
局部变量,局域于函数内。
全局变量,作用于主程序。
$GLOBALS数组与global声明
函数里面要使用全局变量的时候要用global来声明。例:
function myfunc(){
global $PHP_SELF;
echo $PHP_SELF;
}
myfunc();
注意:PHP函数是不区分大小写的
静态变量:
static $mystr;
$mystr="hello";
echo $mystr;
变量的变量:
a="hello";
$$a="world";
echo "$a,$hello"; //hello,world
echo "$a,${$a}"; //hello,world
隐式类型转换
$a[0]=123;
$a[1]=234;
echo $a; //显示Array
$b="123abc";
echo $b+1; //显示124
echo $b."123"; //显示123abc123
$a=12345678901234;
$b=12345678901234;
$c=$a+$b;
$d=“123abc”;
echo $c; //24691357802468
echo (int)$c; //-2147483648
echo(int)$d; //123
运算符
算术运算符
例子 |
名称 |
结果 |
||||
-$a |
取反 |
$a 的负值。 |
||||
$a + $b |
加法 |
$a 和 $b 的和。 |
||||
$a - $b |
减法 |
$a 和 $b 的差。 |
||||
$a * $b |
乘法 |
$a 和 $b 的积。 |
||||
$a / $b |
除法 |
$a 除以 $b 的商。 |
||||
$a % $b |
取模 |
$a 除以 $b 的余数。 |
位运算符
例子 |
名称 |
结果 |
||||
$a & $b |
And(按位与) |
将把 $a 和 $b 中都为 1 的位设为 1。 |
||||
$a | $b |
Or(按位或) |
将把 $a 或者 $b 中为 1 的位设为 1。 |
||||
$a ^ $b |
Xor(按位异或) |
将把 $a 和 $b 中不同的位设为 1。 |
||||
~ $a |
Not(按位非) |
将 $a 中为 0 的位设为 1,反之亦然。 |
||||
$a << $b |
Shift left(左移) |
将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 |
||||
$a >> $b |
Shift right(右移) |
将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 |
比较运算符
例子 |
名称 |
结果 |
||||
$a == $b |
等于 |
TRUE,如果 $a 等于 $b。 |
||||
$a === $b |
全等 |
TRUE,如果 $a 等于 $b,并且它们的类型也相同。(PHP 4 引进) |
||||
$a != $b |
不等 |
TRUE,如果 $a 不等于 $b。 |
||||
$a <> $b |
不等 |
TRUE,如果 $a 不等于 $b。 |
||||
$a !== $b |
非全等 |
TRUE,如果 $a 不等于 $b,或者它们的类型不同。(PHP 4 引进) |
||||
$a < $b |
小与 |
TRUE,如果 $a 严格小于 $b。 |
||||
$a > $b |
大于 |
TRUE,如果 $a 严格 $b。 |
||||
$a <= $b |
小于等于 |
TRUE,如果 $a 小于或者等于 $b。 |
递增/递减运算符
例子 |
名称 |
效果 |
||||
++$a |
前加 |
$a 的值加一,然后返回 $a。 |
||||
$a++ |
后加 |
返回 $a,然后将 $a 的值加一。 |
||||
--$a |
前减 |
$a 的值减一, 然后返回 $a。 |
||||
$a-- |
后减 |
返回 $a,然后将 $a 的值减一。 |
逻辑运算符
例子 |
名称 |
结果 |
||||
$a and $b |
And(逻辑与) |
TRUE,如果 $a 与 $b 都为 TRUE。 |
||||
$a or $b |
Or(逻辑或) |
TRUE,如果 $a 或 $b 任一为 TRUE。 |
||||
$a xor $b |
Xor(逻辑异或) |
TRUE,如果 $a 或 $b 任一为 TRUE,但不同时是。 |
||||
! $a |
Not(逻辑非) |
TRUE,如果 $a 不为 TRUE。 |
||||
$a && $b |
And(逻辑与) |
TRUE,如果 $a 与 $b 都为 TRUE。 |
||||
$a || $b |
Or(逻辑或) |
TRUE,如果 $a 或 $b 任一为 TRUE。 |
或”和“与”居然有2种写法,如果你使用C/C++,C#,Java等语言的话,就用“&&"或”||"吧。如果你是VB的话,就用and,和or。当然你也可以2种都用。它们有什么区别呢?优先级的不同而已。”&&“与"||"比”and“和”or“优先级要高。
数组运算符
例子 |
名称 |
结果 |
||||
$a + $b |
联合 |
$a 和 $b 的联合。 |
||||
$a == $b |
相等 |
如果 $a 和 $b 具有相同的键/值对则为 TRUE。 |
||||
$a === $b |
全等 |
如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。 |
||||
$a != $b |
不等 |
如果 $a 不等于 $b 则为 TRUE。 |
||||
$a <> $b |
不等 |
如果 $a 不等于 $b 则为 TRUE。 |
||||
$a !== $b |
不全等 |
如果 $a 不全等于 $b 则为 TRUE。 |
其它几种运算符
·首先看看位运算里的左移(<<)或右移(>>),其实没有什么不同,只是符号不一样而已。
·看看比较运算法里的“==”,“===”,这两个比较有意思,它们有什么区别呢?
1 <?php
2 var_dump(0 == "a"); // 0 == 0 -> true在PHP里,如果整型和字符串比较时,字符串会自动的转化为数值
3 var_dump("1" == "01"); // 1 == 1 -> true
4
5 switch ("a") {
6 case 0:
7 echo "0";
8 break;
9 case "a": // never reached because "a" is already matched with 0
10 echo "a";
11 break;
12 }
字符串转化为数值的原则是什么?
1)如果包括“.”,“e”或“E”其中任何一个字符的话,字符串被当作 float来求值。否则就被当作整数。
2)该值由字符串最前面的部分决定。如果字符串以合法的数字数据开始,就用该数字作为其值,否则其值为 0(零)。合法数字数据由可选的正负号开始,后面跟着一个或多个数字(可选地包括十进制分数),后面跟着可选的指数。指数是一个“e”或者“E”后面跟着一个或多个数字。
“===”,3个等于符号,它表示不仅最后转化的数值相等,而且类型也应该相等。
赋值运算符
<?php
$a='hello'; //$a是hello。
$a+=1; //$a是1,二元赋值符
$b='world';
$c='hello';
$c.=$b;//$c是"hello world"
?>
错误执行运算符
PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉
如果激活了 track_errors特性,表达式所产生的任何错误信息都被存放在变量 $php_errormsg 中。此变量在每次出错时都会被覆盖,所以如果想用它的话就要尽早检查。
例如:
<?php
/* Intentional file error */
$my_file = @file ('non_existent_file') or
die ("Failed opening file: error was '$php_errormsg'");
// this works for any expression, not just functions:
$value = @$cache[$key];
// will not issue a notice if the index $key doesn't exist.
?>
执行运算符
PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回(例如,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 shell_exec()相同。反引号位于键盘的”~“键那里。
例如:
1 <?php
2 $out=`dir c:`;
3 echo '<pre>'.$out.'</pre>';
4 ?>
结果为:
Volume in drive C has no label.
Volume Serial Number is A019-7D77
Directory of C:"
.....
递增/递减运算符
注: 递增/递减运算符不影响布尔值。递减NULL值也没有效果,但是递增NULL的结果是 1。
例子 |
名称 |
效果 |
++$a |
前加 |
$a 的值加一,然后返回 $a。 |
$a++ |
后加 |
返回 $a,然后将 $a 的值加一。 |
--$a |
前减 |
$a 的值减一,然后返回 $a。 |
$a-- |
后减 |
返回 $a,然后将 $a 的值减 |
类型运算符
PHP 有一个类型运算符:instanceof。instanceof 用来测定一个给定的对象是否来自指定的对象类。instanceof 运算符是 PHP 5 引进的。在此之前用 is_a(),但是 is_a() 已经过时了,最好用 instanceof。
C#里是is,而Java是instanceof,和PHP一样。
例如:
1 <?php
2 class A { }
3 class B { }
4
5 $thing = new A;
6
7 if ($thing instanceof A) {
8 echo 'A';
9 }
10 if ($thing instanceof B) {
11 echo 'B';
12 }
13 ?>
字符运算符
有两个字符串运算符。第一个是连接运算符(“.”),它返回其左右参数连接后的字符串。第二个是连接赋值运算符(“.=”),它将右边参数附加到左边的参数后。
数组
PHP 中的数组实际上是一个有序图。图是一种把 values 映射到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组来使用,或列表(矢量),散列表(是图的一种实现),字典,集合,栈,队列以及更多可能性。因为可以用另一个 PHP 数组作为值,也可以很容易地模拟树。
Array的用法
新建一个Array对象,由于Array是key和value映射的。所以Array支持一定数量以分号分隔的值对。
<?php
$arr = array("Hello" => "Word", 12 => true);
echo $arr["Hello"]; // bar
echo $arr[12]; // 1
?>
请记:key 可以是整型或者字符串。如果键名是一个整型的标准表达方法,取整,如果是float型,转化为整型。与之对比,值则可以为任何值。
如果你想实现多维数组如下代码:
<?php
$arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42));
echo $arr["somearray"][6]; // 5
echo $arr["somearray"][13]; // 9
echo $arr["somearray"]["a"]; // 42
?>
新建或删除一个数组对象代码:
1 ?php
2 $arr = array(5 => 1, 12 => 2);
3 $arr[] = 56; // 相当于 $arr[13] = 56;
4 //因为第二个元素的键是12
5 $arr["x"] = 42; // 创建一个新元素,且键为字符串
6 //"x",值位42.
7 unset($arr[5]); //删除键位5的元素。
8 unset($arr); // 删除整个数组
9 //unset()是一函数,从字面的意思上
//看也知道是撤销设置
10 ?>
语句
三元条件运算符即:$first ? $second : $third
条件
if..else
if (expr) {
statement
}
范例:本例省略大括号。
<?php
if (date("D") == "Sat") echo "周末了,狂欢去";
?>
范例:本例的执行部分有三行,不可省略大括号。
<?php
if (file_exists("/usr/local/lib/php3.ini")) {
echo "以下是 PHP3 的配置文件<p><pre>"n";
readfile("/usr/local/lib/php3.ini");
echo "</pre>"n";
}
?>
if (expr) {
statement1
} else {
statement2
}
直接看下面的例子
<?php
if ($a > $b) {
echo "a 比 b 大";
} elseif ($a == $b) {
echo "a 等于 b";
} else {
echo "a 比 b 小";
}
?>
switch
switch (expr) {
case expr1:
statement1;
break;
case expr2:
statement2;
break;
:
default:
statementN;
break;
}
<?php
switch (date("D")) {
case "Mon":
echo "今天星期一";
break;
case "Tue":
echo "今天星期二";
break;
case "Fri":
echo "今天星期五";
break;
default:
echo "今天放假";
break;
}
?>
循环
do..while 循环
while (expr) {
statement
}
<?php
$i = 1;
while ($i <= 10) {
print $i++;
echo ". 以后不敢了<br>"n";
}
?>
while 可以不用大括号来包住执行部分,而使用冒号加上 endwhile。见下例
<?php
$i = 1;
while ($i <= 10):
print $i++;
echo ". 以后不敢了<br>"n";
endwhile;
?>
for 循环
for (expr1; expr2; expr3) {
statement
}
<?php
for ($i=1; $i<=10; $i++) {
echo "$i. 以后不敢了<br>"n";
}
?>
foreach
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement
第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将 会得到下一个单元)。
第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。
其它的流程控制
break 用来跳出目前执行的循环,如下例
<?php
$i = 0;
while ($i < 10) {
if ($arr[$i] == "stop") {
break;
}
$i++;
}
?>
continue 立即停止目前执行循环,并回到循环的条件判断处,见下例
<?php
while (list($key,$value) = each($arr)) {
if ($key % 2) { // 略过偶数
continue;
}
do_something_odd ($value);
}
?>
函数和对象
函数简介:
分为系统函数和用户函数。
PHP中的函数FUNCTION包括有返回值的及无返回值。PHP中函数不区分大小写。
函数原型:
返回类型函数名称(类型参数1,类型参数2.....);
系统函数:
abs(number):取绝对值
sin,cos,log,log10,exp,pow,pi
srand(int):随机数种子
int rand([int min],[int max]):取得随机数值
....
字符串函数:
strtolower(string str):转小写
strtoupper(string str):转大写
trim(string str):删除左右空格
substr(string string,int start,int [length]):从STRING中取定长字符串
strlen(string str):返回INT类型,取字符串的长度
strpos(string 母串,string 待查字符,int [offset]):寻找字符串中某字符最先出现处
strcmp(string str1,string str2):字符串比较
nl2br(string str):实用HTML格式化
查找字符串的位置可以使用strpos()以及strrpos().
替换的话,调用str_replace()以及substr_replace().
....
加密函数:
md5(string str):返回一个MD5加密的字符串
文件系统函数:
filesize(string filename):获取文件的大小
feof(int fp):是不是到文件尾部
fopen(string filename,string mode):打开文件或者URL
fclose(int fp):关闭已打开的文件
fread()
.....
网络函数:
fsockopen(string hostname,int port,int [error],string p[errorstr],int [timeout]):打开网络的socket链接,取远程文件的内容
gethostbyname(string hostname):DNS查询,返回IP地址
....
MYSQL数据库函数:
mysql_connect(string [hostname] [:port],string [username],string [pwd]):mysql服务器链接
.....
用户函数
声明函数:
function myfunc($arg_1,$arg_2,......)
{
....
return $retval;
}
调用:myfunc(参数列表);
参数的值,通常使用传值方式输入,也可以使用传址的方式,传入参数的指针。方法就是在参数的前面加上&符号即可。
变量的作用域:函数作用域和页面作用域(global声明即可)
函数的嵌套和递归:一个函数调用另一个函数,函数调用自己(注意死循环)
参数默认值:可以给参数指定默认值。
例:
function myfunc($a,$b,$c="默认值"){
echo ...
}
myfunc(3,4);
myfunc(1,2,"不用默认值 ");
条件函数的例子:
1 <?php
2 $isRequired=true;
3 if($isRequired)
4 {
5 function func($op1,$op2)
6 {
7 return $op1+$op2;
8 }
9 }
10 if($isRequired)
11 echo "func(1,3)=".func(1,3);
12
13 function helloWorld()
14 {
15 return "Hello,world";
16 }
17 echo '<br>Call function helloWorld():'.helloWorld();
18 ?>
输出结果为:
func(1,3)=4
Call function helloWorld():Hello,world
函数中的函数:
1 <?php
2 function func()
3 {
4 function subfunc()
5 {
6 echo "I don't exist until func() is called."n";
7 echo "I have alrady made ";
8 }
9 }
10
11 /* We can't call subfunc() yet
12 since it doesn't exist. */
13
14 func();
15
16 /* Now we can call subfunc(),
17 func()'s processesing has
18 made it accessable. */
19
20 subfunc();
21
22 ?>
输出结果是:
I don't exist until func() is called. I have alrady made
对象
PHP 只有类别 (class)、方法 (method)、属性、以及单一继承 (extensions) 等。
程序中的 $this 类变量也和 $GLOBALS 及 $php_errormsg 两个变量一样,在 PHP 中属于特殊的变量。$this 变量只用在类类别中,表示类的本身。
<?php
// 程序名: cart.inc
class Cart {
var $items; // 手推车类
// 本方法加入 $num 件物品到手推车中 (加到 $artnr 变量)
function add_item ($artnr, $num) {
$this->items[$artnr] += $num;
}
// 本方法从手推车减少 $num 件物品 (从 $artnr 变量减掉)
function remove_item ($artnr, $num) {
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} else {
return false;
}
}
}
?>
要使用手推车可以用类似下例的方式。可以先将每个类存成 Include 文件,再将它 require 或 include 进来。在定义变量 $cart 时,要使用 new 的保留字,表示 $cart 使用 Cart 类。使用 -> 符号,表示执行类的方法。
<?php
require("cart.inc");
$cart = new Cart;
$cart->add_item("10", 1);
?>
之后再设计有记名的手推车。记名手推车从手推车遗传下来,因此手推车拥有的方法及属性,记名手推车也有,而记名手推车比手推车增加了名字的方法 (或许该称属性较恰当)。
从下例中可以看到,子类 Named_Cart 使用 extends 来继承其父类 Cart。虽然 Named_Cart 类中没有增加物品及减少物品的方法,不过由于遗传的特性,父类有的东西它都有。
<?php
// 程序名: named_cart.inc
require("cart.inc");
class Named_Cart extends Cart {
var $owner;
function set_owner ($name) {
$this->owner = $name;
}
}
?>
要使用记名手推车类,请看下面的范例。当然这不算太好的设计,每个子类都一直 require 它的父类,会造成服务器在 I/O 上面的负担。在实作时,可以将整个系列的类在同一个程序文件中,从最早的袓先类到最后的子孙类,也方便日后修正。
<?php
require("named_cart.inc");
$ncart = new Named_Cart; // 建立类变量
$ncart->set_owner ("CyberRidder"); // 配置类的记名属性
echo $ncart->owner; // 显示类的记名属性
$ncart->add_item ("10", 1); // 从父类遗传的方法也可使用
?>
例:
class foo{
function do_foo(){
echo "";
}
}
$doo=new foo;
$doo->do_foo(); 调用对象中的函数
引用文件
引用文件的方法有两种:require 及 include。
require 的使用方法如 require("MyRequireFile.php"); 。这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。
include 使用方法如 include("MyIncludeFile.php"); 。这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化。
程序注释
<?php
echo "这是第一种例子。"n"; // 本例是 C++ 语法的注释
/* 本例采用多行的
注释方式 */
echo "这是第两种例子。"n";
echo "这是第三种例子。"n"; # 本例使用 UNIX Shell 语法注释
?>