12
返回列表 发新帖
楼主: keaide

PHP4手册:语法

[复制链接]
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
11#
 楼主| 发表于 2006-8-5 22:16 | 只看该作者
流程控制

--------------------------------------------------------------------------------
if..else 回圈  
--------------------------------------------------------------------------------
  


if..else 回圈有三种构造
第一种是只有用到 if 条件,当作单纯的判断。解释成 "若发生了某事则怎样处理"。语法如下:


if (expr) {
  statement
}

其中的 expr 为判断的条件,通常都是用逻辑运算符号 (logical operators) 当判断的条件。而 statement 为符合条件的执行区段程式,若程式只有一行,可以省略大括号 {}。

范例:本例省略大括号。

if (date("D" == "Sat" echo "周末了,狂欢去";
?>

范例:本例的执行区段有三行,不可省略大括号。

if (file_exists("/usr/local/lib/php3.ini") {
  echo "以下是 PHP3 的设定档

\n";
  readfile("/usr/local/lib/php3.ini";
  echo "
\n";
}
?>  



--------------------------------------------------------------------------------

第二种是除了 if 之外,加上了 else 的条件,可解释成 "若发生了某事则怎样处理,否则该如何解决"。语法如下


if (expr) {
  statement1
} else {
  statement2
}

范例:上面的例子来修改成更完整的处理。其中的 else 由于只有一行执行的指令,因此不用加上大括号。
$f="/usr/local/lib/php3.ini";
if (file_exists($f)) {
  echo "以下是 PHP3 的设定档

\n";
  readfile($f);
  echo "
\n";
} else echo "很抱歉,找不到 $f";
?>

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
12#
 楼主| 发表于 2006-8-5 22:16 | 只看该作者
--------------------------------------------------------------------------------

第三种就是巢状的 if..else 回圈,通常用在多种决策判断时。它将数个 if..else 拿来合并运用处理。

直接看下面的例子

if ($a > $b) {
  echo "a 比 b 大";
} elseif ($a == $b) {
  echo  "a 等于 b";
} else {
  echo "a 比 b 小";
}
?>

上例只用二层的 if..else 回圈,用来比较 a 和 b 二个变数。实际要使用这种巢状 if..else 回圈时,请小心使用,因为太多层的回圈容易使设计的逻辑出问题,或者少打了大括号等,都会造成程式出现莫名其妙的问题。  


--------------------------------------------------------------------------------
do..while 回圈  
--------------------------------------------------------------------------------
  


do..while 是重复叙述的回圈,可以分成二种模式。
最单纯的就是只有 while 的回圈。用来在指定的条件内,不断地重覆指定的动作。语法如下


while (expr) {
  statement
}

其中的 expr 为判断的条件,通常都是用逻辑运算符号 (logical operators) 当判断的条件。而 statement 为符合条件的执行区段程式,若程式只有一行,可以省略大括号 {}。

下例很有趣,要电脑的浏览器出现十次 "以后不敢了" 的字串,前面并加上数字,表示说了第几次不敢了。(感觉好像是 Web Server 做错事被处罚)

$i = 1;
while ($i <= 10) {
  print $i++;
  echo ". 以后不敢了
\n";
}
?>


while 可以不用大括号来包住执行区段,而使用冒号加上 endwhile。见下例

$i = 1;
while ($i <= 10):
  print $i++;
  echo ". 以后不敢了
\n";
endwhile;
?>


另外一种 do..while 回圈则先执行,再判断是否要继续执行,也就是说回圈至少执行一次,有点像是先斩后奏的方法。这种的回圈,和单用 while 是不同的 (单用 while 是先判断再处理)。若读者熟 Pascal 语言的话,会发现 do..while 回圈像是 Pascal 的 repeat..until 回圈。

do..whilte 的语法如下


do {
  statement
} while (expr);


--------------------------------------------------------------------------------
for 回圈  
--------------------------------------------------------------------------------
  


for 回圈就单纯只有一种,没有变化,它的语法如下

for (expr1; expr2; expr3) {
  statement
}

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
13#
 楼主| 发表于 2006-8-5 22:17 | 只看该作者
其中的 expr1 为条件的初始值。expr2 为判断的条件,通常都是用逻辑运算符号 (logical operators) 当判断的条件。expr3 为执行 statement 后要执行的部份,用来改变条件,供下次的回圈判断,如加一..等等。而 statement 为符合条件的执行区段程式,若程式只有一行,可以省略大括号 {}。

下例是用 for 回圈写的 "以后不敢了" 的例子,可以拿来和用 while 回圈的比较。

for ($i=1; $i<=10; $i++) {
  echo "$i. 以后不敢了
\n";
}
?>


从上例中,可以很明显的看到,用 for 和用 while 的不同。实际应用上,若回圈有初始值,且都要累加(或累减),则使用 for 回圈比用 while 回圈好。例如将资料从资料库取出,可能用 for 回圈会比用 while 回圈适合?  

  
switch 回圈  
--------------------------------------------------------------------------------
  


switch 回圈,通常处理复合式的条件判断,每个子条件,都是 case 指令区段。在实作上若使用许多类似的 if 指令,可以将它综合成 switch 回圈。
语法如下


switch (expr) {
  case expr1:
    statement1;
    break;
  case expr2:
    statement2;
    break;
    :
    :
  default:
    statementN;
    break;
}

其中的 expr 条件,通常为变数名称。而 case 后的 exprN,通常表示变数值。冒号后则为符合该条件要执行的区段。注意要用 break 跳离回圈。

switch (date("D") {
  case "Mon":
    echo "今天星期一,猴子穿新衣";
    break;
  case "Tue":
    echo "今天星期二,猴子肚子饿";
    break;
  case "Wed":
    echo "今天星期三,猴子去爬山";
    break;
  case "Thu":
    echo "今天星期四,猴子看电视";
    break;
  case "Fri":
    echo "今天星期五,猴子去跳舞";
    break;
  default:
    echo "今天放假,不管猴子了";
    break;
}
?>

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
14#
 楼主| 发表于 2006-8-5 22:17 | 只看该作者
很明显的,上述的例子用 if 回圈就很麻烦了。当然在设计时,要将出现机率最大的条件放在最前面,最少出现的条件放在最后面,可以增加程式的执行效率。上例由于每天出现的机率相同,所以不用注意条件的顺序。  

  

--------------------------------------------------------------------------------
其它的流程控制  
--------------------------------------------------------------------------------
  


除了上面的流程控制指令之外,尚有 break 及 continue 二个流程控制指令。
break 用来跳出目前执行的回圈,如下例

$i = 0;
while ($i < 10) {
  if ($arr[$i] == "stop" {
    break;
  }
  $i++;
}
?>




--------------------------------------------------------------------------------

continue 即刻停止目前执行回圈,并回到回圈的条件判断处,见下例

while (list($key,$value) = each($arr)) {
  if ($key % 2) { // 略过偶数
    continue;
  }
  do_something_odd ($value);
}
?>


而 BASIC 常用的 goto 在 C 及 Borland Pascal 中或许可以使用。但在 PHP 中,由于它的 Web Server Script 特性以及结构化的组成,并不能在 PHP 中使用 goto 回圈指令?

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
15#
 楼主| 发表于 2006-8-5 22:17 | 只看该作者
函式与物件

--------------------------------------------------------------------------------
函式  
--------------------------------------------------------------------------------
  


在 PHP 中,允许程式设计者将常用的流程或者变数等元件,组织成一个固定的格式。也就是说使用者可以自行组合函式或者是物件。
PHP 中的函式 (function) 和 C 语言一样,包括有传回值的及无传回值的,不像 Pascal 分成函式 (function) 和程序 (procedure) 那么复杂。

在函式的名称上,PHP 对于大小写的管制很松散。可以在定义函式时写成大写的名字,而在使用时使用小写的名字。总之,对函式而言,不用管大小写,只要注意名称没有重复就好了。

以下就是函式的使用语法


function myfunc($arg_1, $arg_2, ..., $arg_n) {
  // 执行一些动作
  return $retval;
}

在使用时,在自定的函式名称前要加入 function 的保留字,表示这是定义使用者自定函式。之后的 myfunc 可以是任何的英文字母开头的字串,字串除了开头不能是数字或是底线,在第一个字母后可以是阿拉伯数字或者是底线,当然其它的符号或是中文字不能当函式名。

$arg_1 到 $arg_n 为函式使用的参数,参数之间使用逗号隔开。在参数后的大括号 {},即为整个函式的区段。函式若有传回值,使用 return 可将值传回。而参数可以事先定义初始值或内定值。有定义内定值的参数在使用函式时可以省略,但一定要放在没有设定内定值参数的后面,否则 PHP 在解析函式时,会出现错误。

另外就是参数的形态,只要参数是 PHP 支援的变数型态都可以使用,无论是阵列、字串、或是整数....等等。传回值也是一样。

下面即为使用内定值及不用内定值的例子

function myfunc1($arg_1, $arg_2, $arg_3="我是内定字串" {
  echo $arg_1+$arg_2;
  echo $arg_3."
\n";
}

myfunc(3, 4);               // 参数 $arg_3 省略。
myfunc(6, 6, "不用内定值"  // 输入参数 $arg_3。
?>

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
16#
 楼主| 发表于 2006-8-5 22:18 | 只看该作者
参数的值,通常使用传值的方式输入,有时在特别的需求时,可以使用传址的方式,传入参数的指标。方法就是在参数的前面加上 & 符号即可。如下例

function myfunc2(&$argstr) {
  $argstr=ereg_replace("/", "-", $argstr);
}

$today="2000/01/01";
myfunc2($today);
echo $today;   // 2000-01-01;
?>


--------------------------------------------------------------------------------
物件  
--------------------------------------------------------------------------------
  


使用者定义的物件,也是学好 PHP 所必备的条件之一。而 PHP 的物件,和其它的物件导向语言比较起来,还算蛮单纯的。PHP 只有类别 (class)、方法 (method)、属性、以及单一继承 (extensions) 等。对不习惯使用 C++、Java、Delphi 等物件导向语言来开发程式的使用者,不妨先阅读一下有关物件导向观念的书,相信可以带来许多的收获。
下面的范例是手推车的物件。可以看到,使用 class 表示它是一个物件类别。在类别中的 function,例如 add_item 则表示该物件的一个方法。方法可以封装物件的实际处理情形,让该物件自己能依封装好的方法来执行一些动作。

程式中的 $this 物件变数也和 $GLOBALS 及 $php_errormsg 二个变数一样,在 PHP 中属于特殊的变数。$this 变数只用在物件类别中,表示物件的本身。

// 程式名: 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;
    }   
  }
}
?>

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
17#
 楼主| 发表于 2006-8-5 22:18 | 只看该作者
要使用手推车可以用类似下例的方式。可以先将每个物件存成 Include 档案,再将它 require 或 include 进来。在宣告变数 $cart 时,要使用 new 的保留字,表示 $cart 使用 Cart 物件。使用 -> 符号,表示执行物件的方法。

require("cart.inc";
$cart = new Cart;
$cart->add_item("10", 1);
?>


之后再设计有记名的手推车。记名手推车从手推车遗传下来,因此手推车拥有的方法及属性,记名手推车也有,而记名手推车比手推车增加了名字的方法 (或许该称属性较恰当)。

从下例中可以看到,子物件 Named_Cart 使用 extends 来继承其父物件 Cart。虽然 Named_Cart 物件中没有增加物品及减少物品的方法,不过由于遗传的特性,父物件有的东西它都有。

// 程式名: named_cart.inc
require("cart.inc";
class Named_Cart extends Cart {
  var $owner;
  function set_owner ($name) {
    $this->owner = $name;
  }
}
?>


要使用记名手推车物件,请看下面的范例。当然这不算太好的设计,每个子物件都一直 require 它的父物件,会造成伺服器在 I/O 上面的负担。在实作时,可以将整个系列的物件在同一个程式档案中,从最早的袓先物件到最后的子孙物件,也方便日后修正。

require("named_cart.inc";
$ncart = new Named_Cart;           // 建立物件变数
$ncart->set_owner ("CyberRidder"; // 设定物件的记名属性
echo $ncart->owner;                // 显示物件的记名属性
$ncart->add_item ("10", 1);        // 从父物件遗传的方法也可使用
?>


因此,在 PHP 中使用了 extends 保留字,加上良好的系统分析与完整的 CRC 卡片 (详见物件导向相关书籍) 设计之后,PHP 可变成拥有强大物件能力的 CGI 语言。

PHP 由于是剧本语言 (Script),因此程式原始码可见,在软体工程中的元件黑箱并不会在目前的 PHP 版本中出现,也就是说,全部的物件其实没有隐藏起它的内容。对于软体业者而言,没有办法保护所谓的软体 IC,站在开放社群而言,反而有原始码是件好事,至于孰是孰非,就很难判定了,不过目前 PHP 还是 Open Source 社群的一份子,或许日后 Zend 引擎可以做到物件封装的功能也不一定。

使用道具 举报

回复
论坛徽章:
66
ERP板块每日发贴之星
日期:2005-08-18 01:01:39生肖徽章2007版:兔
日期:2008-01-02 17:35:53生肖徽章2007版:牛
日期:2008-01-02 17:35:53生肖徽章2007版:蛇
日期:2008-04-07 19:42:14体育版块博采纪念徽章
日期:2008-07-03 19:47:13CTO参与奖
日期:2009-02-20 09:44:20生肖徽章2007版:狗
日期:2009-09-07 16:03:53ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522013年新春福章
日期:2013-02-25 14:51:24生肖徽章:鸡
日期:2006-09-07 17:09:37
18#
发表于 2006-8-6 08:56 | 只看该作者
恩,辛苦了

使用道具 举报

回复
论坛徽章:
4
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB元老
日期:2009-05-27 11:36:49
19#
发表于 2006-8-7 11:16 | 只看该作者
3Q

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表