PHP和MySQL Web开发(第三版)前四章心得

1、PHP标记风格
PHP标记有四种不同的风格可供使用。
XML风格
<?php echo "XML style tag";?>
这是被推荐使用的风格,因为它是不能被禁用的,因此可以保证在所有的服务器上使用这种风格的标记。
简短风格
<? echo "short style tag";?>
这种标记风格是最简单的,但你必须在配置文件中启用short_open_tag选项,或者启用短标记选项编译PHP。
SCRIPT风格
<SCRIPT LANGUAGE='php'>echo "SCRIPT style tag";</SCRIPT>
这种标记风格是最长的,如果读者使用过JavaScript或VBScript,就会熟悉这种风格。如果读者所使用的HTML编辑器无法支持其他的标记风格,可以使用它。
ASP风格
<% echo "ASP style tag";%>
这种标记风格与Active Server Page(ASP)或ASP.NET的标记风格相同。如果在配置设定中启用了asp_tags选项,就可以使用它。如果读者所使用的编辑器是为ASP或ASP.NET而设计的,或者已经习惯了ASP或ASP.NET的编程风格,读者可能希望使用它。但是请注意,在默认情况下,该标记风格是禁用的。

2、变量风格
根据PHP版本和设置的不同,通过变量,可以有3种方法来访问表单数据。这些方法并没有正式的名称,因此我们给它们定义了3个昵称,分别是简短风格、中等风格和冗长风格。
你可以按如下所示的方法访问tireqty域的内容:
$tireqty                    //简短风格
$_POST['tireqty']           //中等风格
$HTTP_POST_VARS['tireqty']  //冗长风格
. 简短风格($tireqty)非常方便,但是需要将register_globals配置选项设置为on。该选项的默认设定值与PHP的版本相关。在4.2.0以后的所有版本中,该配置的默认值为off。以前,该配置的默认值为on,而且大多数PHP程序员都使用简短风格。这种变化曾经引起一些混淆。这个风格也可能会使你遇到代码不安全的错误,因此我们不再推荐这种风格。
. 中等风格($_POST['tireqty'])是如今所建议的。它也非常方便,但是它只在PHP 4.1.0版本中被支持,因此无法在一些早期版本中使用。
. 冗长风格($HTTP_POST_VARS['tireqty'])是最详细的,但是请注意,它已经过时,因此从长远看,这种风格可能会被删除。这种风格过去曾是最容易移植的,但是如今可以通过register_long_arrays配置指令禁用它,这样可以改进性能。
简短风格可以使用类似于$tireqty的变量,像这样对变量的直接访问是非常方便的,但是这可能会使读者遇到破坏脚本安全性的编程错误。由于表单变量会自动转换成全局变量,因此在读者所创建的变量与直接来自用户的不可信任的变量之间没有明显的区别。
中等风格涉及了从$_POST、$_GET或$_REQUEST数组之一检索变量。$_GET或$_POST数组之一都可以保存表单变量的细节。使用哪一个数组取决于提交表单时使用的方法是POST还是GET。此外,通过POST或GET方法提交的所有数据都可以通过$_REQUEST数组获得。

3、双引号与单引号中的变量
对于任何非数组变量,可以将变量写入到一个由双引号引用起来的字符串中,在双引号中,变量名称将被变量值所替代。而在单引号中,变量名称,或者任何其他的文本都会不经修改而发送给浏览器。
例如 echo "$tireqty tires"将输出 200 tires;而 echo '$tireqty tires'将输出 $tireqty tires

4、变量名称(标识符)
. 标识符可以是任何长度,而且可以由任何字母、数字、下划线组成。
. 标识符不能以数字开始。
. 在PHP中,标识符是区分大小写的。函数名称可以是任意大小写的。一个变量名称可以与一个函数名称相同。这一点容易造成混淆,虽然是允许的,应该尽量避免。

5、类型转换
使用类型转换,可以将一个变量或值转换成另一种类型。这种转换与C语言的类型转换是相同的。只需在希望进行类型转换的变量之前的圆括号中插入需要转换为的临时数据类型。
比如:
$total=0;
$totalamount=(float)$total;
就可以把$total的值转成浮点数赋予$totalamount
可用的类型有以下这些:
. Integer(整数)—用来表示整数
. Float(浮点数,也叫Double,双精度)—用来表示所有的实数
. String(字符串)—用来表示字符串
. Boolean(布尔)—用来表示true或者false
. Array(数组)—用来保存具有相同类型的多个数据项
. Object(对象)—用来保存类的实例
也可以通过调用一个函数来实现转换变量数据类型的目的。如下所示的3个函数可以用来实现这项功能:
int    intval(mixed var[, int base]);
float  floatval(mixed var);
string strval(mixed var);

6、改变变量的名称(可变变量)
即用一个变量的值作为另一个变量的名称,例如:
$varname='tireqty';
$$varname=5;
这个代码等价于:
$tireqty=5;

7、引用和重置
引用操作符&可以在关联赋值中使用。例如:
$a=5;
$b=&$a;
$a=7;
之后$a和$b都=7。引用就像一个别名,而不是一个指针。$a和$b都指向了内存的相同地址。可以通过重置它们来改变所指向的地址,如下所示:unset($a);
重置并不会改变$b(7)的值,但是可以破坏$a和值7保存在内存中的连接。

8、==和===
相等的比较操作符==(两个等于号)允许测试两个值是否相等。恒等操作符===(三个等于号)。只有当恒等操作符两边的操作数相等并且具有相同的数据类型时,其返回值才为true。例如,0==‘0’将为true,但是0===‘0’就不是true

9、执行操作符
执行操作符实际上是一对操作符,它是一对反向单引号(``)。反向引号不是一个单引号—通常,它与~位于键盘的相同位置。
PHP将试着将反向单引号之间的命令当作服务器端的命令行来执行。表达式的值就是命令的执行结果。例如,在类似于UNIX的操作系统中,可以使用:$out=`ls -la`;echo $out;或者在Windows服务器上,可以使用:$out=`dir c:`;echo $out;这两种版本都会得到一个目录列表并且将该列表保存在$out中,然后,再将该列表显示在浏览器中或用其他方法来处理。

10、数组操作符
PHP提供了一些数组操作符。数组元素操作符([ ])允许访问数组元素。在某些数组上下文中,也可以使用=>操作符。下面是数组操作符的完整列表:
+               联合            $a+$b   返回一个包含$a和$b中所有元素的数组
==              等价            $a==$b  如果两个数组具有相同的元素,返回true
===             恒等            $a===$b 如果两个数组具有相同的元素以及相同的顺序,返回true
!=              非等价          $a!=$b  如果两个数组不是等价的,返回true
<>              非等价          $a<>$b  如果两个数组不是等价的,返回true
!==             非恒等          $a!==$b 如果两个数组不是恒等的,返回true

11、目录间隔符
在UNIX环境下,目录中的间隔符是正斜线(/)。如果你使用的是Windows平台,可以使用正斜线或者反斜线。如果使用反斜线,就必须使用转义(escape,标注为一个特殊字符)字符,这样fopen()函数才能正确理解这些字符。要转义一个字符,只需简单地在其前面添加一个反斜线。如下代码所示:$fp=fopen($_SERVER['DOCUMENT_ROOT']."\\..\\orders\\orders.txt",'w');
在PHP代码中,只有少数人会使用反斜线,因为这意味着代码只能在Windows上运行。如果使用了正斜线,代码不需要任何修改就可以在Windows和UNIX机器上运行。

12、读取文件内容
fgets($fp[,int maxlenth])每次读取一行,到换行符、文件结束符或maxlenth-1的长度字符
fgetss()同fgets(),但是它可以过滤字符串中包含的PHP和HTML标记。
fgetcsv($fp,100,"\t")以分隔符(\t)为定界符,读取指定长度,结果返回到数组。

13、读取整个文件
readfile($filename)打开文件,将全部内容输出到标准输出(浏览器)中,然后关闭。
fpassthru()。要使用这个函数,必须先使用fopen()打开文件。然后将文件指针作为参数传递给fpassthru()。这样就可以把文件指针所指向的文件内容发送到标准输出。然后再将这个文件关闭。
第三种读取整个文件的函数是file()。它和readfile()是一样的,只是不将文件内容回显到标准输出,而是把结果发送到一个数组中。
最后,在PHP 4.3.0中,还可以使用file_get_contents()函数。这个函数与file()相同,但是该函数将以字符串的形式返回文件内容,而不是数组。这个新函数的优点在于,它是二进制安全的。

14、读取一个字符
文件处理的另一个方法是从一个文件中一次读取一个字符。可以使用fgetc()函数来实现。它具有一个文件指针参数,这也是该函数的惟一参数,而且它将返回文件的下一个字符。比如下面这段代码使用fgetc()函数从文件中一次读取一个字符,并且将该字符保存在$char中,直到文件结束。然后再用HTML的换行符(<br/>)替换文本中的行结束符(\n)。
<?php
  
while (!feof($fp))
  {
    
$char=fgetc($fp);
    if (!
feof($fp))
      echo (
$char=="\n"?'<br />':$char);
  }
?>
这样做仅仅是为了整理输出格式。如果输出文件的记录之间带有\n,那么整个文件将显示在一行中。因此你必须用HTML的换行符(<br/>)替换文本中的行结束符(\n)。使用fgetc()函数的一个缺点就是它返回文件结束符EOF,而fgets()则不会。读取出字符后还需要判断feof(),因为我们并不希望将文件结束符EOF回显到浏览器中。

15、数组的初始化与访问
数字索引数组:$products = array('tires','oil','spark plugs')
如果需要将按升序排列的数字保存在一个数组中,可以使用range()函数自动创建这个数组。如下这行代码将创建一个从1到10的数字数组:
$numbers = range(1,10)
range()函数具有一个可选的第三个参数,这个参数允许设定值之间的步幅。例如,如需建立一个1到10之间的奇数数组,可以使用如下代码:
$odds = range(1,10,2)
range()函数也可以对字符进行操作,如下例所示:$letters = range('a','z')
由于数组使用有序的数字作为索引,所以使用一个for循环就可以很容易地显示数组的内容:
<?php
  
for ($i=0,$i<3,$i++)
    echo 
"$products[$i] ";
?>
或者使用foreach循环:
<?php
  
foreach ($products as $current)
    echo 
$current." ";
?>
非数字索引数组:$prices = array('tires'=>100,'oil'=>10,'spark plugs'=>4)
访问方法:
<?php
  
foreach ($prices as $key=>$value)
    echo 
$key.'=>'.$value.'<br />';
?>
或者:
<?php
  
while ($element each($prices))
  {
    echo 
$element['key'].' - '.$element['value'].'<br />'
  }
?>
此外,还有一种更为高级和常见的方式来完成相同的操作。函数list()可以用来将一个数组分解为一系列的值。可以按照如下方式将函数each()返回的两个值分开:
list($product,$price) = each($prices)
以上代码使用each()从$prices数组中取出当前元素,并且将它作为数组返回,然后再指向下一个元素。它还使用list()将从each()返回的数组中所包含0、1两个元素变为两个名为$product和$price的新变量。随后就可以用echo "$product - $price<br />"来显示,输出结果与前面的方式相同,但更容易阅读,因为list()允许为新变量命名。
需要注意的一点是,当使用each()函数时,数组将记录当前元素。如果希望在相同的脚本中两次使用该数组,就必须使用函数reset()将当前元素重新设置到数组开始处。

16、数组排序
对于数字索引数组,可以使用sort($arrayname)函数对元素进行升序排序,该函数的第二个参数是可选的,用于指定排序类型。这个可选参数可以传递SORT_REGULAR(默认值)、SORT_ NUMERIC或SORT_STRING。
对于非数字索引数组,如果需要按元素排序,可使用asort(),需要按关键字排序,则使用ksort()。
sort()、asort()和ksort()这3个不同的排序函数都使数组按升序排序。它们每个都对应有一个反向排序的函数,可以将数组按降序排序。实现反向排序的函数是rsort()、arsort()和krsort()。

17、多维数组自定义排序
在多维数组中,每个元素都是一个数组。PHP不知道如果比较两个数组,所以需要建立一个比较它们的方法。
例如下面这个数组:
$products = array( array( 'TIR','Tires',100),
                   array( 'OIL','Oil',10),
                   array( 'SPK','Spark Plugs',4))
如果我们打算对订单数组中的第二列—说明,按字母进行排序,则需要自定义如下函数:
<?php
  
function compare($x,$y)
  {
    if (
$x[1]==$y[1])
      return 
0;
    else if (
$x[1]<$y[1])
      return -
1;
    else
      return 
1;
  }
?>
随后使用usort($products,'compare')即可。如果需要按价格排序或者反向排序,只需简单改变函数即可。

18、其他数组操作
shuffle($array_name)打乱数组,随机排列。
array_reverse($array_name)返回一个内容相同但顺序相反的数组。
each($array_name)会在指针前移一个位置之前返回当前元素。
next($array_name)是将指针前移,然后再返回新的当前元素。
current($array_name)将返回当前元素。
reset()函数将返回指向数组第一个元素的指针。
end($array_name)可以将指针移到数组末尾。
prev($array_name)将当前指针往回移一个位置然后再返回新的当前元素。
count($array_name)统计数组元素个数。
sizeof($array_name)统计数组元素个数。
array_count_values($array_name)统计每个特定的值在数组($array_name)中出现过的次数。返回的是一个以特定值为关键字,以该特定值出现的次数为值的数组。

19、对数组的每一个元素应用函数:array_walk()
有时候,我们可能希望以相同方式使用或者修改数组中的每一个元素。array_walk()函数允许进行这样的操作。其调用方法类似于前面所介绍的usort()函数的调用,array_walk()函数要求声明一个你自己的函数。正如你所看到的,array_walk()函数需要三个参数。第一个是arr,也就是需要处理的数组。第二个是func,也就是用户自定义并将作用于数组中每个元素的函数。第三个参数userdata是可选的,如果使用它,它可以作为一个参数传递给我们自己的函数。
看一个例子:
<?php
  
function my_multiply(&$value,$key,$factor)
  { 
$value *= $factor;}
  
array_walk(&$array,'my_multiply',3);
?>
在这里,我们定义了一个名为my_multiply()的函数,它可以用所提供的乘法因子去乘以数组中的每个元素。需要使用array_walk()函数的第三个参数来传递这个乘法因子。因为需要这个参数,所以在定义my_multiply()函数时必须带有三个参数—一个数组元素值($value)、一个数组元素的关键字($key)和参数($factor)。可以选择忽略这个关键字。
此外,还有一个需要注意的问题是传递参数$value的方式。在my_multiply()的函数定义中,变量前面的地址符(&)意味着$value是按引用方式传递的。按引用方式传递允许函数修改数组的内容。

20、字符串格式化
chop()去除连续空白
trim()去除开始位置和结束位置的空白
ltrim()去除开始位置的空白
rtrim()去除结束位置的空白
此处默认的空白是指换行符和回车符、水平和垂直制表符、字符串结束符、空格。另外也可以通过第二个参数提供要去除的特殊字符。
nl2br()将换行符转成<br />
Strtoupper()将字符串转换成大写
Strtolower()将字符串转换成小写
Ucfirst()如字符串的第一个字符是字母,则转换成大写
Ucwords()如字符串每个单词的第一个字符是字母,则转换成大写
addslashes()在引号、反斜杠、NULL字符前加\
stripslashes()去除上面函数所加的\

21、字符串连接与分割
explode($separator,$input)以指定的分隔符将字符串分成小块,结果返回到一个数组
implode()或join()格式与上相同,作用相反
strtok()以指定的分隔符将字符串分成小块,每次返回一个小块(令牌)
substr()返回一个字符串中给定起点和长度的子字符串

22、字符串比较
strcmp()比较两个参数字符串,相等返回0,前者大则返回正数,否则返回负数
strcasecmp()功能同上,不区分大小写
strnatcmp()按自然排序(即人们习惯的顺序,比如'12'大于'2')比较两个参数字符串,相等返回0,前者大则返回正数,否则返回负数
strnatcasecmp功能同上,不区分大小写

23、字符串查找
strstr()在一个目标字符串中查找另一个字符串needle,若找到则返回从第一个needle开始到目标字符串结束的全部,否则返回false
strchr()同上,即另一个字符串也可以是一个字符
stristr()同strstr(),不区分大小写
strrchr()同strstr(),但返回从最后一个needle开始到目标字符串结束的全部
strpos()返回needle在目标字符串中第一次出现的位置
strrpos()返回needle在目标字符串中最后一次出现的位置

24、字符串替换
str_replace(string needle, string new_needle, string haystack[,int count]);
用new_needle来替换haystack中所有的needle,返回替换后的结果,count可指定要执行的替换次数。
其中,needle、new_needle、haystack都可以使用数组。
substr_replace(string haystack, string needle, int start[,int length]);
使用needle替换haystack中从start开始的字符串。start代表要替换字符串位置的开始偏移量,如为0或正数,就从字符串开始处计算。负数则从字符串末尾开始计算。length代表php停止替换操作的位置,如不给定则会从start位置一直到字符串结束。length为0,替换字符串会插入到字符串中;为正数表示用新字符串替换掉的字符串长度;为负数表示从字符串尾部开始到第length个字符停止替换。