叁柒設計 三七设计 Three seven design 我的学习与分享
详细信息
来自:关键字:

PHP4手册:语法(二) 常量与变量

  December 21th,2008 22:39:58   Category : PHP+Mysql
 Click (1033)


--------------------------------------------------------------------------------
 常数型态 
--------------------------------------------------------------------------------
 


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() 的功能可以让我们自行定义所需要的常数。见下例

define("COPYRIGHT", "Copyright © 1999, Wilson Peng");
echo COPYRIGHT;  // 送出 "Copyright © 1999, Wilson Peng" 字串。
?>


--------------------------------------------------------------------------------
 变数型态 
--------------------------------------------------------------------------------
 


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["PHP_SELF"] 取出 $PHP_SELF 的值。

// 本程式使用 $GLOBALS 阵列
function myfunc() {
  echo $GLOBALS["PHP_SELF"];
}
myfunc();
?>


下面是错误的示范,请勿模仿,上面的才是正确的示范。

// 这是错误的示范
function errfunc() {
  echo $PHP_SELF;
}
errfunc();
?>


但是这个错误的示范要是改成下例就没问题了

// 本程式使用全域宣告
function myfunc() {
  global $PHP_SELF;
  echo $PHP_SELF;
}
myfunc();
?>


在变数前面加上 global 的名称,就是宣告该变数为全域变数。用这种方式,就不需使用 $GLOBALS 阵列,也能让变数进入自行开发的函式中。

接下来先看静态变数的例子

// 静态变数的例子
function myfunc() {
  static $mystr;
  $mystr.="哈";
  echo $mystr."
\n";
}
myfunc();   // 哈
myfunc();   // 哈哈
myfunc();   // 哈哈哈
?>


函式在执行时所产生的变数,在函式结束时就消失了,有时因为程式的需要,函式在回圈中,当不希望变数在每次执行完函式就消失的话,静态变数 (static variable) 就派上用场了。上例中,使用 $mystr 变数之前,先在变数前面加上 static,即表示变数 $mystr 是静态变数,当每次执行 myfunc() 函式时,$mystr 的值会一直增加,每执行一次就多一个哈字。若将 static 的静态变数宣告拿掉,就没办法累加哈字了。

// 不是静态变数的例子 (错误的)
function myfunc() {
  $mystr.="哈";
  echo $mystr."
\n";
}
myfunc();   // 哈
myfunc();   // 哈
myfunc();   // 哈
?>


再看一个比较实际的例子,它是处理表格的颜色,让隔行的颜色不同。

function TdBackColor() {
  static $ColorStr;
  if ($ColorStr=="808080") {
    $ColorStr="c0c0c0";
  } else {
    $ColorStr="808080";
  }
  return($ColorStr);
}
echo "\n";
for ($i=0; $i<10; $i++) {
  $ColorStr=TdBackColor();
  echo "
这是第".$i."行
\n";
}
echo " ";
?>


PHP 的变数使用技巧上,最令人觉得不可思议的则是变数的变数 (variable variable)。这是充分利用 PHP 特性玩出的特殊技巧

$a = "Hello";
$$a = "world";
echo "$a, $hello";   // Hello, world
echo "$a, {$a}";    // 也是 Hello, world
?>


mdean@kcnet.com 举出一个更绝的例子 (24-Apr-1999),他称为变数的函式 (variable function)

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 实在是太神奇了。


由于 PHP 许多语法都是 C 语言的翻版,故 PHP 在使用变数时,随时都可以使用新的变数,只要在使用前将变数初始化就好了,不必像 Pascal 语言那样严谨,所有要使用的变数都要事先宣告。这当然有好处与坏处:好处是使用方便、自由;坏处就是常常因这些自由而付出相当大的代价除错。在程式码短的 PHP 程式当然不成问题,当程式在数百数千行,甚至 include 或 require 好几层之后,问题就浮现出来了。无论如何,保持良好的写作习惯才是避免浪费青春的方法。

[ 资讯评论 ]
暂时没有任何评论!
[ 提交评论 ]
请选择表情
  • 昵称:
  • *
  • 验证码:
  • *点击更换验证码
  • 尚能输入个字符
申明:本网站部分分享内容来自网络,如有侵权请及时与我联系,谢谢,另网友评论仅代表个人观点,与本站立场无关,如果在评论中发表违反我国任何法律的,请即时与我们联系(QQ:77132915),我们将立即予以删除. [ 注:提交评论后,通过审核后方能在网站上显示!]