第一章 PHP快速入门
php的变量有三种风格
短风格:php变量与html表单中的表单域名相同。$tireqty
中等风格:$_POST["tireqty"] $_GET $_REQUEST
长风格:$HTTP_POST_VARS['tireqty'] $HTTP_GET_VARS (可能会消失)
点号(.)是字符串连接符 echo $tireqty.'tires
';
如果$tireqty不是数组变量,则也可以写成:echo "$tireqty tires
';
PHP中有一种特殊的类型,resource变量,一般它代表外部资源(如数据库连接),不能直接操作一个resource变量。
PHP是弱类型的,可以在任何时间根据保存在变量中的值来确定变量的类型。
如:$total = 0.00 (此时为Float类型)
$total = 'hello' (此时为String类型)
也可以进行类型转换:
$a1 = 0
$a2 = (float)$a1
一个变量的值可以作为另一个变量的名称:
$varname = 'a1';
$$varname = 5; <==>(这两句等价于) $1 = 5;
声明常量: define ('PRICE', 100);
使用常量: echo PRICE; (注意,在前面没有$)
常量只能保存布尔值,整数,浮点数或字符串数据。
PHP中也有“引用”的概念。
$a = 5;
$b = &$a;
$a = 7;
此时b的值也会变成7
unset($a) 会重置$a所指向的地址会破坏$a和7保存在内存中的连接,但不会改变$b(7)
0 == '0' 会返回true
0 === '0' 返回false (三个等号表示恒等操作,不仅值相等,而且类型也要相同)
还有不恒等 !==
错误抑制操作符@
$a = @(57/0);
可以防止产生警告,否则会产生一个除0警告。
执行操作符(反向单引号``)
$out = `ls -la`;
echo '
'.$out.''
可以在浏览器中显示一个目录列表
数组操作符:
$a + $b
$a == $b; $a === $b; $a != $b; $a <> $b($a和$b不等价则为true); $a !== $b;
gettype($a); 可以得到$a类型的描述字符串。
settype($a, 'double'); 将$a设为双精度类型。
is_array(); is_double();…… 等等,可以查看变量是否属于某种类型,返回true或false。
控制结构基本上与c完全一样。
if/switch/while/for/foreach
if($var == 0){somecode;}可以替换为如下的结构:
if($var == ):
somecode;
endif;
可以使用declare,设置代码块的执行指令。
第二章 数据的存储与检索
fopen("$DOCUMENT_ROOT/../order.txt", 'w'); //可以用反斜线表示目录,但只能在Windows上使用。 (fclose($fp))
fopen("order.txt", 'w', true); //在php的include_path中搜索order.txt文件
如果文件名是以http://开始,fopen将建立一个到指定服务器的http连接,并返回一个指向http响应的指针。
@$fp = fopen("/sss/test.txt", 'w');
if (!$fp)
{
//处理打开文件出错,如果在$fp前不加@,则php会出现出现错误提示信息。
}
fwrite($fp, $outputstring[, int length]); (fwrite等同于fputs)
php5新增了:
int file_put_contents(string filename, string data[, int flags[, resource context]]) 可以不用fopen直接操作文件(与之对应的是file_get_contents())
fgetss函数类似于fgets,但可以过滤某些特殊标志。
fgetcvs可以以某个定界符作为文件的分行处。
fread()可以读取任意长度的字节。
file() readfile()等,都可以读取整个文件
file_exists()检查文件是否存在。
filesize()确定文件大小。
unlink()删除文件
rewind()、fseek()、ftell()在文件中定位。
flock在使用文件前加锁
第三章 使用数组
数字索引数组的初始化:$products = array('tires', 'oil', 'spark');
$numbers = range(10, 15); 创建10-15的数组 $odds = range(1, 10, 2); 2代表步幅。
foreach($arr, as $elem)
echo $elem;
$arr是数组,elem是单个元素
相关数组的初始化:$prices = array('tires'=>100, 'oil'=>10, 'spark'=>4);
$prices = array('tires'=>100); $prices['oil'] = 10;
遍历相关数组:
foreach ($prices as $key => $value)
echo $key.'=>'.$value.'
';
也可以使用list()和each()也可以遍历数组的内容。each()会返回数组的当前元素,并将下一个元素作为当前元素。(如果想再次使用对$price使用each()函数,则必须用reset($price)将数组重新设到开始处。)
while ($elem = each($price)){code;}
list($product, $price) = each($price); //这句代码可将$price数组分解为两个数组,$product中仅存储$price中的第一个元素,然后$price就存储剩下的。
数组操作:$a+$b,数组b将会被附加到a中,但是任何关键字冲突的元素将不会被添加。
$a==$b,数组a和b包含相同元素(顺序不一定相同)
$a===$b,数组a和b包含相同元素,且顺序相同。
数组的元素可以是另一个数组,即可以是多维数组。
$products = array( array('TIR', "Tires', 100),
array('OIL', 'oil', 10),
array('SPK', 'spark', 4) );
echo $products[1][0];
sort($products);可以对数组进行排序。
sort($products, SORT_NUMRIC); 排序类型为数字排序。
asort()和ksort()可以对“相关数组“排序。(asort按元素值来排序,ksort按关键字排序。)
rsort()、arsort()、krsort()分别为反向排序,即按“降序”排列。
要对二维数组进行排序,则要自定义排序方法:
function compare($x, $y){
if (...) return 0;
else if (...) return -1;
else return 1;
}
usort($products, 'compare');
usort中的u代表user,表示要用户自定义的比较函数。还有uasort()和uksort()。
shuffle()可以对数组各元素进行随机排序。array_reverse()可以将数组反向排序。
从文件中载入数组:
$orders = file("$DOCUMENT_ROOT/../orders.txt");
$number = count($orders); //取得数组的个数,orders中的每个元素,是原文件中的每一行。
for ($i = 0; $i < $number; $i++)
{echo $orders[$i];}
可以用$line = explode("/t", $orders[$i]);再将每一行再分割成n个元素,分隔符就是"/t".这些元素再存储到$line中。
intval()可以从字符串中提取数字。
每个数组中都有一个内部指针指向数组中的当前元素。当使用函数each()时,就间接地使用了这个指针,但是也可以直接使用和操作这个指针。
current($array_name);可以返回当前指针所指元素。
next()返回下一个,end()返回最后一个,prev()返回前一个,reset()返回第一个元素,并将指针设到相应的位置.
对数组的每一个元素应用任何函数:array_walk()
function my_print($value) { echo "$value
"; } //这个自定义函数最多可以有3个参数,分别为:value、key、userdata,userdata通过array_walk()的第3个参数来传递。
array_walk($array, 'my_print');
这个类似于c++标准库中的for_each()。
统计数组元素的个数:count()、sizeof()、array_count_values()。
count()与sizeof()相同,都返回数组元素个数。
array_count_values()可以统计每个特定的值在数组中出现过的次数(数组的基数集)。这个函数返回一个包含频率表的相关数组。
extract()可以通过一个相关数组创建一系列的标量变量,标题变量的名字就是数组中关键字的名字。
如:$array = array( 'key1' => 'value1', 'key2' => 'value2');
extract($array); //自动创建两个变量,$key1和$key2
echo "$key1 $key2"; //就可以显示:value1 value2
extract有3个参数,第二个参数extract_type指定如何处理冲突,比如已经有同名的变量(默认的操作是覆盖)。
第四章 字符串操作与正则表达式
mail函数可以直接发送邮件,它的原型为:
bool mail(string to, string subject, string message,
string [additional_headers [, string additional_parameters]]);
trim()函数可以除去字符串开始位置和结束位置的空格,并将结果字符串返回。(这儿是广义上的空格,包括回车换行、制表符、字符串结束符、空格等)。它的第二个参数也可以指定要过滤的特殊字符。(还有ltrim和rtrim分别去除左边或右边的空格)。
nl2br()可以将字符串中的换行符用
来代替。
使用printf()或sprintf()可以格式化一些显示的字符串。
如果想用printf打印出"%"符号,必须使用"%%"。
printf("total amount is %2/$d and %1/$d, $total, $total_ship);
"2/$"表示用参数列表中的第二个参数替换(只要直接在"%"后添加参数的位置,并以$符号为结束就可以)。
也存在vprintf()和vsprintf()。
Strtoupper()字符串转为大写, Strtolower()转为小写, Ucfirst()如果字符串的第一个字符是字母,就将其转为大写,Ucwords()将每个单词的第一个字母转为大写。
addslashes()和stripslashes()可以格式化字符串以便存储。如引号、反斜杠、NULL等往数据库中存储的时候会出问题。所以在存储前要将这些可能被解释为特殊字符的转义为普通字符。
explode可以根据一个指定的分割符将字符串本身分割为小块,并将分割后的小块返回到一个数组中。
$email_array = explode('@', $email);
implode()等同于join(),起到与explode()相反的效果。
strtok()也可以将字符串分割为小块。
substr()可以返回一个子串。
strcmp()、strcasecmp()、strnatcmp()用来对字符串进行排序。strnatcmp()是按人们习惯进行的“自然排序”(2会小于12,如果按字典序,2会大小12)。
strstr()、strchr()、strrchr()、stristr()都可以在字符串中查找字符串。
strstr完全等同于strchr。
strpos()、strrpos()查找子串的位置,并且运行速度要比strstr快。
str_replace()通过在字符串中查找子串,而将查找到的子串进行替换。
substr_replace()则通过指定替换字符串中指定位置的子串。
PHP支持POSIX和Perl风格的正则式语法。默认是POSIX,但可通过编译PCRE来使用Perl风格的。
查找字串符串:ereg()和eregi()。
int ereg(string pattern, string search, array [matches]); //eregi()不区分大小写。
替换子字符串:ereg_replace()。(也有eregi_replace())。
分割字符串:split()。
一般来说,对于同样的功能,正则表达式函数运行效率要低于字符串上函数。如果应用程序足够简单,最好使用字符串表达式。