php初级教程--语法
简述hello, world
--------------------------------------------------------------------------------
在 K&R 二教授的经典名著 The C Programming Language 一书中的 "hello, world" 几乎已经变成了所有程式语言的第一个范例。因此,在这儿也用 PHP 来写个最基本的 "hello, world" 程式。
<html>
<head>
<title>First program</title>
</head>
<body>
<?php
echo "hello, world\n";
?>
</body>
</html>
我们可以看到,这个程式只有三行有用,其它六行都是标准的 HTML 语法。而它在传回浏览器时和 JavaScript 或 VBScript 完全不一样,PHP 的程式没有传到浏览器,只在浏览器上看到短短的几个字 "hello, world"。
在第六行及第八行,分别是 PHP 的开始及结束的嵌入符号。第七行才是伺服器端执行的程式。在这个例子中,"\n" 和 C 语言的表示都一模一样,代表换行的意思。在第一章也有介绍过 PHP 是混合多种语言而成,而 C 正是含量最多的语言。在一个叙述式结束后,要加上分号代表结束。
嵌入方法 -------------------------------------------------------------------------------
要将 Homepage 中放入 PHP,有以下数种做法
<? echo ("这是一个 PHP 语言的嵌入范例\n"; ?>
<?php echo("这是第二个 PHP 语言的嵌入范例\n"; ?>
<script language="php">
echo ("这是类似 JavaScript 及 VBScript 语法
的 PHP 语言嵌入范例";
</script>
<% echo ("这是类似 ASP 嵌入语法的 PHP 范例"); %>
其中第一种及第二种是最常用的二个方法,在小于符号加上问号后,可以加也可以不加 php 三个字,之后就是 PHP 的程式码。在程式码结束后,加入问号大于二符号就可以了。第三种方法对熟悉 Netscape 伺服器产品的 Webmaster 人员而言,有相当的亲切感,它是类似 JavaScript 的写作方式。而对于从 Windows NT 平台的 ASP 投向 PHP 的使用者来说,第四种方法似曾相似,只要用 PHP 3.0.4 版本以后的伺服器都可以用小于百分比的符号开始,以百分比大于结束 PHP 的区段,但想用第四种方法的使用者别忘了在 php.ini 加入 asp_tags 或是在编译 PHP 时加入 --enable-asp-tags 的选项,才能使第四种方法有效。建议少用第四种方法,当 PHP 与 ASP 原始码混在一起时就麻烦了。
其实,在写作 PHP 的程式最好的方法,就是先处理好纯 HTML 格式的 Homepage 文件之后,再将需要变数或其它处理的地方改成 PHP 程式。这种方法,可以让您在开发上达到事半功倍的效果。
引用档案
--------------------------------------------------------------------------------
PHP 最吸引人的特色之一大概就是它的引用档案了。用这个方法可以将常用的功能写成一个函式,放在档案之中,然后引用之后就可以呼叫这个函式了。
引用档案的方法有二种:require 及 include。二种方式提供不同的使用弹性。
require 的使用方法如 require("MyRequireFile.php"); 。这个函式通常放在 PHP 程式的最前面,PHP 程式在执行前,就会先读入 require 所指定引入的档案,使它变成 PHP 程式网页的一部份。常用的函式,亦可以这个方法将它引入网页中。
include 使用方法如 include("MyIncludeFile.php"); 。这个函式一般是放在流程控制的处理区段中。PHP 程式网页在读到 include 的档案时,才将它读进来。这种方式,可以把程式执行时的流程简单化。
在 PHP 的官方网站中,每页都可以看到原始程式,更是处处看到这二种引入档案的方法。
程式注解
--------------------------------------------------------------------------------
在 PHP 的程式中,加入注解的方法很灵活。可以使用 C 语言、C++ 语言或者是 UNIX 的 Shell 语言的注解方式,而且也可以混合使用。这可以让每个写 PHP 网页程式的 Webmaster 或 Programmer 发展出属于自己的写作风格。
<?php
echo "这是第一种例子。\n"; // 本例是 C++ 语法的注解
/* 本例采用多行的
注解方式 */
echo "这是第二种例子。\n";
echo "这是第三种例子。\n"; # 本例使用 UNIX Shell 语法注解
?>
不过在使用多行注解时请注意,不能让注解陷入巢状回圈当中,否则会引起错误。
<?php
/*
echo "这是错误的示范。\n"; /* 巢状注解会引起问题 */
*/
?>
常数与变数
常数型态
--------------------------------------------------------------------------------
PHP 在常数中定义了以下一些常数。
__FILE__
这个内定常数是 PHP 程式档名。若引用档案 (include 或 require)则在引用档案内的该常数为引用档案名,而不是引用它的档案名。
__LINE__
这个内定常数是 PHP 程式行数。若引用档案 (include 或 require)则在引用档案内的该常数为引用档案的行,而不是引用它的档案行。
PHP_VERSION
这个内建常数是 PHP 程式的版本,如 '3.0.8-dev'。
PHP_OS
这个内建常数指执行 PHP 剖析器的作业系统名称,如 'Linux'。
TRUE
这个常数就是真值 (true)。
FALSE
这个常数就是伪值 (false)。
E_ERROR
这个常数指到最近的错误处。
E_WARNING
这个常数指到最近的警告处。
E_PARSE
本常式为剖析语法有潜在问题处。
E_NOTICE
这个常式为发生不寻常但不一定是错误处。例如存取一个不存在的变数。
这些 E_ 开头形式的常数,可以参考 error_reporting() 函式,有更多的相关说明。
当然在程式写作时,以上的内定常数是不够用。define() 的功能可以让我们自行定义所需要的常数。见下例
<?php
define("COPYRIGHT", "Copyright ?2000, netleader.126.com";
echo COPYRIGHT;
?>
变数型态
--------------------------------------------------------------------------------
PHP 的变数型态不多,有以下五种:
string
integer
double
array
object
string 即为字串变数,无论是单一字元或数千字的字串都是使用这个变数型态。值得注意的是要指定字串给字串变数,要在头尾加上双引号 (例如: "这是字串"。在欲让字串换行时,可使用溢出字元,也就是反斜线加上指定的符号,若是 \x 加上二位数字,如 \xFE 即表十六进位字元,详见下表:
符号 意义
\" 双引号
\\ 反斜线
\n 换行
\r 送出 CR
\t 跳位 (TAB)
integer 为整数型别。在 32 位元的作业系统中,它的有效范围是 -2,147,483,648 到 +2,147,483,647。要使用 16 进位整数可以在面加 0x。
double 为浮点数型别。在 32 位元的作业系统中,它效范围是 1.7E-308 到 1.7E+308。
array 为阵列变数,可以是二维、三维或者多维阵列,其中的元素也很自由,可以是 string、integer 或者 double,甚至是 array。
object 为物件变数,目前在 PHP 中的物件不多,若论及物件,Microsoft 的 ASP 物件仍然较 PHP 的内定物件多,相信这有赖大家的努力。不过话又说回来,Web CGI 程式要求的是效率,以完全物件导向的方式,恐怕使用者在浏览时也会因为程式执行速度慢而很不耐烦吧。
要使用变数,只要在英文字串前面加个钱号 $ 即可,目前变数名称仍不能使用中文。至于变数的大小写是不一样的,对开发 PHP 程式的 TEAM 来说,最好使用相同的变数使用风格,以免届时因为变数大小的问题,花许多无谓的时间去找寻问题点,那就麻烦了。
以下为变数的使用范例:
$mystring = "我是字串";
$WilsonPeng = "真是认真的作者";
$NewLine = "换行了\n";
$int1 = 38;
$int2 = 49;
$hexint = 0x10;
$float1 = 1.732;
$float2 = 1.4E+2;
$MyArray1 = array("子", "丑", "寅", "卯";
$MyArray2 = array(
"地支" => array("子", "丑", "寅", "卯"),
"生肖" => array("鼠", "牛", "虎", "兔"),
"数字" => array(1, 2, 3, 4)
);
物件的使用上就比较麻烦了,要先宣告类别,甚至必须先要方法,方可使用物件,如下例:
class foo {
function do_foo () {
echo "Doing foo.";
}
}
$bar = new foo;
$bar -> do_foo ();
更多有关物件的讨论,参考 物件
此外,还有布林值 (boolean),通常 1 即为 true,0 为 false。
在变数之间,若要转换型态,在 PHP 程式中是很自由的,直接就拿来用了,不必经过特殊的转换函式。当然,浮点数转成整数就有点牵强了,不过可以将浮点数转成字串,也是很好处理。
变数的使用
--------------------------------------------------------------------------------
就像大部份的结构化程式,有所谓的全域变数与区域变数,PHP 在这方面也是有相同的处理方式。
在 PHP 的程式执行时,系统会在记忆体中保留一块全域变数的区域。实际运用时,可以透过 $GLOBALS["变数名称"] 将需要的变数取出。在使用者自定的函式或程序中,就可以用 $GLOBALS 阵列取出需要的变数。当然别忘了 PHP 的变数有分大小写,搞错了大小写可是叫一百年,变数也不会出来。
$GLOBALS 阵列是 PHP 程式中比较特殊的变数,不必宣告,系统会自动匹配相关的变数在里面。在函式中,也不必管 $GLOBALS 阵列是否已经做全域宣告,就可以直接使用了。
和 $GLOBALS 变数类似的还有 $php_errormsg 字串变数。若 PHP 的设定档 (php.ini/php3.ini) 中的 track_errors 选项打开的话,会有全域变数 $php_errormsg 可以看到错误的讯息。
在 PHP 中,全域变数的有效范围 (scope) 仅限于主要程式中,不会影响到函式中同名的变数,也就是全域变数与区域变数互不侵犯。若要变数能通透到函式中,就要用到 $GLOBALS 阵列或是使用 global 宣告。
例如,在自行开发的函式中,要取得目前执行 PHP 程式页面的档名,就可以用 $GLOBALS["HP_SELF"] 取出 $PHP_SELF 的值。
<?php
// 本程式使用 $GLOBALS 阵列
function myfunc() {
echo $GLOBALS["HP_SELF"];
}
myfunc();
?>
下面是错误的示范,请勿模仿,上面的才是正确的示范。
<?php
// 这是错误的示范
function errfunc() {
echo $PHP_SELF;
}
errfunc();
?>
但是这个错误的示范要是改成下例就没问题了
<?php
// 本程式使用全域宣告
function myfunc() {
global $PHP_SELF;
echo $PHP_SELF;
}
myfunc();
?>
在变数前面加上 global 的名称,就是宣告该变数为全域变数。用这种方式,就不需使用 $GLOBALS 阵列,也能让变数进入自行开发的函式中。
接下来先看静态变数的例子
<?php
// 静态变数的例子
function myfunc() {
static $mystr;
$mystr.="哈";
echo $mystr."<br>\n";
}
myfunc(); // 哈
myfunc(); // 哈哈
myfunc(); // 哈哈哈
?>
函式在执行时所产生的变数,在函式结束时就消失了,有时因为程式的需要,函式在回圈中,当不希望变数在每次执行完函式就消失的话,静态变数 (static variable) 就派上用场了。上例中,使用 $mystr 变数之前,先在变数前面加上 static,即表示变数 $mystr 是静态变数,当每次执行 myfunc() 函式时,$mystr 的值会一直增加,每执行一次就多一个哈字。若将 static 的静态变数宣告拿掉,就没办法累加哈字了。
<?php
// 不是静态变数的例子 (错误的)
function myfunc() {
$mystr.="哈";
echo $mystr."<br>\n";
}
myfunc(); // 哈
myfunc(); // 哈
myfunc(); // 哈
?>
再看一个比较实际的例子,它是处理表格的颜色,让隔行的颜色不同。
<?php
function TdBackColor() {
static $ColorStr;
if ($ColorStr=="808080") {
$ColorStr="c0c0c0";
} else {
$ColorStr="808080";
}
return($ColorStr);
}
echo "<table border=1>\n";
for ($i=0; $i<10; $i++) {
$ColorStr=TdBackColor();
echo "<tr><td bgcolor=".$ColorStr.">这是第".$i."行</td></tr>\n";
}
echo "</table>";
?>
PHP 的变数使用技巧上,最令人觉得不可思议的则是变数的变数 (variable variable)。这是充分利用 PHP 特性玩出的特殊技巧
<?php
$a = "Hello";
$$a = "world";
echo "$a, $hello"; // Hello, world
echo "$a, {$a}"; // 也是 Hello, world
?>
[email]mdean@kcnet.com[/email] 举出一个更绝的例子 (24-Apr-1999),他称为变数的函式 (variable function)
<?php
function myCallbackFunction()
{
print("Hello from callback");
}
function myFunction($callback)
{
$callback();
}
// call to myFunction passing callback
// function as parameter
myFunction("myCallbackFunction");
?>
至于使用者在 FORM 中输入的资料,要怎么处理呢?要是在 PHP 的设定档中,track_vars 设为 On 时,直接使用变数名字就好了。如下例,next.php 在执行时,系统会自动产生二个变数 $username 及 $sex,直接使用就好了,比起传统的 CGI 要自己剖析,PHP 实在是太神奇了。
<form action=next.php method=post>
姓名: <input type=text name="username"><br>
性别: <input type=text name="sex"><br>
<input type=submit>
</form>
由于 PHP 许多语法都是 C 语言的翻版,故 PHP 在使用变数时,随时都可以使用新的变数,只要在使用前将变数初始化就好了,不必像 Pascal 语言那样严谨,所有要使用的变数都要事先宣告。这当然有好处与坏处:好处是使用方便、自由;坏处就是常常因这些自由而付出相当大的代价除错。在程式码短的 PHP 程式当然不成问题,当程式在数百数千行,甚至 include 或 require 好几层之后,问题就浮现出来了。无论如何,保持良好的写作习惯才是避免浪费青春的方法。
页:
[1]
