函数|语法
函数
在 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。
?>
参数的值,通常使用传值方式输入,有时在值得的需求时,可以使用传址的方式,传入参数的指针。方法就是在参数的前面加上 & 符号即可。如下例
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;
}
}
}
?>
要使用手推车可以用类似下例的方式。可以先将每个类存成 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;
}
}
?>
名前付き trolley クラスを使用するには、以下の例を参照してください。もちろん、これはあまり良い設計ではありません。各サブクラスは常にその親クラスを必要とするため、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 は依然として Molecule コミュニティの一部であり、将来的には Zend エンジンがクラスのカプセル化機能を実装できるようになるかもしれません。