第三章 语法 5,函数与类

函数|语法

函数

在 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 支持的变量类型都可以使用,无论是数组、字符串、或是整数....等等。返回值也是一样。

下面即为使用默认值及不用默认值例子

<?php
function myfunc1($arg_1, $arg_2, $arg_3="我是默认字符串") {
  echo $arg_1+$arg_2;
  echo $arg_3."<p>\n";
}

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

参数的值,通常使用传值方式输入,有时在值得的需求时,可以使用传址的方式,传入参数的指针。方法就是在参数的前面加上 & 符号即可。如下例

<?php
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 变量只用在类类别中,表示类的本身。

<?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);        // 从父类遗传的方法也可使用
?>

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

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

 

时间: 2024-08-17 20:01:51

第三章 语法 5,函数与类的相关文章

第三章——使用系统函数、存储过程和DBCC SQLPERF命令来监控SQLServer(1)

原文:第三章--使用系统函数.存储过程和DBCC SQLPERF命令来监控SQLServer(1) 忘了说明:本系列文章出自<Microsoft SQL Server 2012 Performance Tuning Cookbook>,将会陆续推出译文,但是由于工作需要,没有按顺序贴出来. 本系列文章包含三部分: 1.  使用系统统计函数(system statistical functions)来监控系统健康程度. 2. 使用系统存储过程来监控SQLServer进程和会话. 3.  使用DB

Knockout应用开发指南 第三章:绑定语法(3)

原文:Knockout应用开发指南 第三章:绑定语法(3) 12   value 绑定 目的 value绑定是关联DOM元素的值到view model的属性上.主要是用在表单控件<input>,<select>和<textarea>上. 当用户编辑表单控件的时候, view model对应的属性值会自动更新.同样,当你更新view model属性的时候,相对应的元素值在页面上也会自动更新. 注:如果你在checkbox或者radio button上使用checked绑定

Knockout应用开发指南 第三章:绑定语法(2)

原文:Knockout应用开发指南 第三章:绑定语法(2) 7   click 绑定 目的 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 例子 <div> You've clicked <span data-bind="text: numberOfClicks"></span> times<button data-bi

Knockout应用开发指南 第三章:绑定语法(1)

原文:Knockout应用开发指南 第三章:绑定语法(1) 第三章所有代码都需要启用KO的ko.applyBindings(viewModel);功能,才能使代码生效,为了节约篇幅,所有例子均省略了此行代码. 1   visible 绑定 目的 visible绑定到DOM元素上,使得该元素的hidden或visible状态取决于绑定的值. 例子 <div data-bind="visible: shouldShowMessage"> You will see this me

unix系统编程-关于apue第三章fcntl函数

问题描述 关于apue第三章fcntl函数 其中的if(val & O_APPEND )是什么意思,还有就是fcntl(fdF_SETFL0):和fcntl(fdF_GETFL0)第三个参数设置为0 分别是什么意思 解决方案 fcntl()函数fcntl函数fcntl 函数

PHP,JScript和VBScript函数和类的语法

1)函数的例子 php: function inc($val) { return $val 1;} 过程也是个函数,只不过没有返回值. jscript, javascript: function inc(val) { return val 1;} 过程的定义同上. VBScript: function inc(val) inc = val 1 end function procedure sub inc2(byref val) val = val 1 end sub 2)类的例子 php: cl

JavaScript ECMA-262-3 深入解析.第三章.this_javascript技巧

介绍 在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节.讨论的主题就是this关键字. 实践证明,这个主题很难,在不同执行上下文中确定this的值经常会发生问题. 许多程序员习惯的认为,在程序语言中,this关键字与面向对象程序开发紧密相关,其完全指向由构造器新创建的对象.在ECMAScript规范中也是这样实现的,但正如我们将看到那样,在ECMAScript中,this并不限于只用来指向新创建的对象. 下面让我们更详细的了解一下,在ECMAScript中this的值到底是什么? 定义 t

Java初级笔记-第三章

第三章 程序设计基础 3.1 流程图 3.1.1 什么是流程图: 流程图是通过箭头(流程线)相互连接的几何图形来表达程序运行的方法. 流程图是算法的一种图形化描述,比较直观的表达了一件事务的处理过程.相对于代码来讲容易理解. 3.1.2 流程图的组成: 画流程图的方法是:从左到右.从上到下.根据问题的需要,确定解决问题的先后处理顺序以及前提条件,将流程线将各图形符号连接起来,直观的表达自己的逻辑思想或问题的处理方法,最终达到预期的结果. 注意事项: 一个流程图只能有一个开始框,开始框作为处理问题

Pro JavaScript Techniques第三章: 创建可重用的代码

 Pro JavaScript Techniques第三章: 创建可重用的代码 mozart0 [楼主] 匪徒田老大 版主 帖子 2326体力 6628 威望 177 注册 2003-6-18 #1 发表于 2007-4-8 12:46  资料  短消息  加为好友  Pro Javascript Techniques翻译连载:说明和目录 当与其它程序员共同开发代码时(这里对大多数合作或团队项目来说是很常见的),为了保持你们的清醒而维护良好的编程惯例将会变得极其重要.随着近年来JavaScrip