PHP的数据类型

时间:2022-10-19 17:09:00

简介

PHP支持8种基本的数据类型

四种标量类型:

boolen

integer

float(double)

string

两种复合类型:

array

object(对象)

最后是两种特殊类型:

resource(资源)

NULL(NULL)

还有其他的伪类型:

mixed

number

callback

以及伪变量$...

Note:如果想查看某个表达式的值和类型,用 var_dump().

如果只是想得到一个易读懂的类型的表达方式用于调试,用gettype().要判断某个类型,不要用gettype(),而用is_type函数.

 

<?php
    $a_bool =TRUE;//bool
    $a_str1="foo";//string
    $a_str2="foo";//string
    $a_int=12;//integer

    echo gettype($a_bool);//prints out:boolean//注意 不要写成a_bool,前面要加上$
    echo gettype($a_int);//prints out:integer//注意 不要写成a_bool,前面要加上$
    
    /*
     If this is an integer,increment it by four
     */
    if(is_int($a_int))
    {
        $a_int+=4;
        echo $a_int;
    }
    //if $a_bool is a string,print it out
    if(is_string($a_bool))
    {
        echo "String:$a_bool";
    }
?>

如果要将一个变量强制转换为某类型,可以对其使用强制转换或者settype()函数.

 

 

布尔类型

语法

要制定一个布尔值,使用关键字TRUE或FALSE.这两个不区分大小写.

<?php

  $foo=True;//assign the value TRUE to $ foo

?>

通常需要用某些运算符返回boolean值,并将其传递给控制流程.

<?php
    $action="show_version";
    //==是一个操作符,它检测两个变量是否相等,并返回一个布尔值
    if($action=="show_version"){
        echo "The version is 1.23";
    }
    //这样做是不必要的...
    if($show_separators==TRUE){
        echo "<hr>\n";
    }
    //...因为可以使用下面这种简单的方式
    if($show_separators){
        echo "<hr>\n";
    }
?>

 

小练习:

<?php
    var_dump((bool) "");//false
    var_dump((bool) 1);//true
    var_dump((bool) -2);//true
    var_dump((bool) "foo");//true
    var_dump((bool) 2.3e5);//true
    var_dump((bool) array(12));//true
    var_dump((bool) array());//false
    var_dump((bool) "false"); //true
?>

 

整型

 一个integer是集合Z={...,-2,-1,0,1,2,...}中的一个数

Example #1整数文字表达

<?php
    $a=1234;
    $a=-1234;
    $a=0123;//八进制数(等于十进制83)
    $a=0x1A;//十六进制数(等于十进制26)
?>

Example #2八进制数的怪事

<?php

  var_dump(01090);//八进制010=十进制8

?>

解释:如果向八进制数传递了一个非法数字(即8或9),则后面其余数字会被忽略.

 

字符串

 一个字符串通过下面的4种方法来定义:

单引号

双引号

heredoc语法结构

nowdoc语法结构(自PHP 5.3.0以后)

定义一个字符串 的最简单的方法是用单引号把它包围起来 (标点符号 ')。

如果想要输出一个单引号,需在它的前面加个反斜线 (\)。在单引号前或在字符串的结尾处 想要输出反斜线,输入两条 (\\)。注意,如果在任何其它的字符前加了反斜线,反斜线将会被直接输出。

Note: 不像双引号heredoc语法结构, 在单引号字符串中的变量 和特殊含义的字符将 不会 被替换。

<?php
echo 'this is a simple string';

// 可以录入多行
echo 'You can also have embedded newlines in 
strings this way as it is
okay to do';

// 输出: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';

// 输出: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';

// 输出: You deleted C:\*.*?
echo 'You deleted C:\*.*?';

// 输出: This will not expand: \n a newline
echo 'This will not expand: \n a newline';

// 输出: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
 

Heredoc结构

第三种定义字符串的方法是用heredoc句法结构:<<<。在该提示 符后面,要定义个标识符,然后是一个新行。接下来是字符串 本身,最后要用前面定义的标识符作为结束标志。

结束时所引用的标识符必须在一行的开始位置, 而且,标识符的命名也要像其它标签一样遵守PHP的规则:只能包含 字母、数字和下划线,并且不能用数字和下划线作为开头。

Warning

要注意的是结束标识符这行除了 可能有一个分号(;)外,绝对不能包括 其它字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或tabs。更重要的是结束标识符的前面必须是个被本地 操作系统认可的新行标签,比如在UNIX和Mac OS X系统中是\n ,而结束标识符(可能有个分号)的后面也必须跟个 新行标签。

如果不遵守该规则导致结束标签不“干净”,PHP将认为它不是结束标识符而继续寻找。如果在文件结束前也没有找到一个正确的结束标识符,PHP将会在最后一 行产生一个句法错误。

Heredocs结构不能用来初始化class,而从PHP 5.3以后,则该限制只能用在包含变量的情况下。

Example #1 非法的示例

<?php
class foo {
    public $bar = <<<EOT
bar
EOT;
}
?>

Heredoc结构就象是没有使用双引号的双引号字符串, 这就是说在heredoc结构中引号不用被替换,但是上文中列出的字符 (\n等)也可使用。 变量将被替换,但在heredoc结构中字符串表达复杂变量时,要格外小 心。

 

Example #2 Heredoc结构的字符串示例

<?php
    $str = <<<EOD
    Example of string
    spanning multiple lines
    using heredoc syntax.
    EOD;
    
    /* 含有变量的更复杂示例 */
    class foo
    {
        var $foo;
        var $bar;
        
        function foo()
        {
            $this->foo = 'Foo';
            $this->bar = array('Bar1', 'Bar2', 'Bar3');
        }
    }
    
    $foo = new foo();
    $name = 'MyName';
    http://i.cnblogs.com/EditPosts.aspx?postid=5145397
    echo <<<EOT
    My name is "$name". I am printing some $foo->foo.
    Now, I am printing some {$foo->bar[1]}.
    This should print a capital 'A': \x41
    EOT;
    ?>

以上会输出:

My name is "$name". I am printing some $foo->foo.

Now, I am printing some {$foo->bar[1]}.

This should not print a capital 'A': \x41

 

Note:
不像heredocs结构,nowdocs结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或变量:

Example #7表态数据的示例

<?php
class foo {
    public $bar = <<<'EOT'
bar
EOT;
}
?>
 
Note:
Nowdoc结构是在PHP 5.3.0中加入的.
 
变量解析
当字符串用双引号或heredoc结构定义时,其中的变量将会被解析.
这里共有两种语法规则:一种简单规则,一种复杂规则.简单的句法规则是最常用和最方便的,它可以用最少的代码在一个字符串中
加入变量,数组值或对象属性.
复杂的句法规则是在PHP4 以后加入的,被花括号包围的表达式是其明显标记.
 
<?php
    $beer='Heineken';
    echo "$beer's taste is great";//valid,单引号" ' "是非法的变量名组成元素
    echo "He drank some $beers";//invalid.字母s是有效的变量名组成元素,但是这里的变量是$beer
    echo "He drank some ${beer}s";//valid
    echo "He drank some {$beer}s";//valid
?>
类似的,一个数组索引或者一个对象属性也可以被解析.数组索引要用方括号[]来表示边际,对象属性则是和上述的变量规则相同.
 
<?php
// 下面的例子是在字符串中引用数组
// 当数组处于字符串外部时,要把数组的值用括号括起来且不要用花括号{ }

// 显示所有错误
error_reporting(E_ALL);

$fruits = array('strawberry' => 'red''banana' => 'yellow');

// 有效;但是注意在字符串外面不能这样引用数组
echo "A banana is $fruits[banana].";

// 有效
echo "A banana is {$fruits['banana']}.";

// 有效,但是PHP会先寻找常量banana
echo "A banana is {$fruits[banana]}.";

// 无效,要用花括号,这里将会产生一个解析错误
echo "A banana is $fruits['banana'].";

// 有效
echo "A banana is " $fruits['banana'] . ".";

// 有效
echo "This square is $square->width meters broad.";

// 无效,解决方法见复杂结构
echo "This square is $square->width00 centimeters broad.";
?>

如果想要表达更复杂的结构,请用复杂句法规则.

复杂句法规则

复杂句法规则不是结构复杂而命名,而是因它可以使用复杂的表达式.

任何想用在字符串中标量变量,数组变量或者对象属性都可以使用这种方法.只需简单地像在

字符串以外的地方那样写出表达式,然后用花括号{}把它括起来.由于{}无法被转义,只有$要

紧挨着才会被认出来,可以用{\$来表达{$.

 

<?php
$beer 'Heineken';
echo "$beer's taste is great"//有效;单引号"'"是非法的变量名组成元素
echo "He drank some $beers"//无效;字母s是有效的变量名组成元素,但是这里的变量是$beer
echo "He drank some ${beer}s"// 有效
echo "He drank some {$beer}s"// 有效
?>

类似的,一个 数组 索引或一个 对象 属性也可被解析。数组索引要用方括号 (]) 来表示边际, 对象属性则是和上述的变量规则相同。

<?php
// 下面的例子是在字符串中引用数组
// 当数组处于字符串外部时,要把数组的值用括号括起来且不要用花括号{ }

// 显示所有错误
error_reporting(E_ALL);

$fruits = array('strawberry' => 'red''banana' => 'yellow');

// 有效;但是注意在字符串外面不能这样引用数组
echo "A banana is $fruits[banana].";

// 有效
echo "A banana is {$fruits['banana']}.";

// 有效,但是PHP会先寻找常量banana
echo "A banana is {$fruits[banana]}.";

// 无效,要用花括号,这里将会产生一个解析错误
echo "A banana is $fruits['banana'].";

// 有效
echo "A banana is " $fruits['banana'] . ".";

// 有效
echo "This square is $square->width meters broad.";

// 无效,解决方法见复杂结构
echo "This square is $square->width00 centimeters broad.";
?>

如果想要表达更复杂的结构,请用复杂句法规则。

复杂句法规则

复杂句法规则不是结构复杂而命名,而是因为它可以使用复杂的表达式。

任何想用在字符串中标量变量,数组变量或对象属性都可使用这种方法。 只需简单地像在字符串以外的地方那样写出表达式, 然后用花括号{}把它括起来。 由于 { 无法被转义,只有 $ 要紧挨着 {才会被认出来,可以用 {\$ 来表达 {$。下面的示例可以更好的解释:

<?php
// 显示所有错误
error_reporting(E_ALL);

$great 'fantastic';

// 无效,输出: This is { fantastic}
echo "This is { $great}";

// 有效,输出: This is fantastic
echo "This is {$great}";
echo "This is ${great}";

// 有效
echo "This square is {$square->width}00 centimeters broad."

// 有效
echo "This works: {$arr[4][3]}";

// 这是错误的表达式,因为就象$foo[bar] 的格式不能在字符串以外的地方使用一样。
// 换句话说,只有在PHP能找到常量foo 的前提下才会正常工作;这里会产生一个E_NOTICE (undefined constant)级别的错误。
echo "This is wrong: {$arr[foo][3]}"

// 有效,当在字符串中使用多重数组时,一定要用括号将它括起来
echo "This works: {$arr['foo'][3]}";

// 有效
echo "This works: " $arr['foo'][3];

echo "This works too: {$obj->values[3]->name}";

echo "This is the value of the var named $name{${$name}}";

echo "This is the value of the var named by the return value of getName():
{${getName()}}";

echo "This is the value of the var named by the return value of
\$object->getName(): {${$object->getName()}}";

// 无效,输出: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>

也可以在字符串中用变量来调用类的属性。

<?php
class foo {
    var $bar 'I am bar.';
}

$foo = new foo();
$bar 'bar';
$baz = array('foo''bar''baz''quux');
echo "{$foo->$bar}\n";
echo "{$foo->$baz[1]}\n";
?>

以上例程会输出:


I am bar.
I am bar.

Note:

函数、行为、类的静态变量和类的常量只有在PHP 5以后才可在 {$} 中使用。然而,只有在用返回的值作为名 称的变量存在的情况下才会进行处理,只单一使用花括号 ({}) 无法处理从函数或行为的返回值或从类的常量或静态变量的返 回值。

<?php
    //显示所有的错误
    error_reporting(E_ALL);
    class beers{
        const softdrink='rootbeer';
        public static $ale='ipa';
    }
    $rootbeer=' A & W ';
    $ipa='Alexander Keith\s';
    //有效,输出:I'd like an A&W
    echo "I'd like an {${beers::softdrink}}\n";
    //也有效,输出:I'd like an {${beers;$ale}}\n";
    echo "I'd like an {${beers::$ale}}\n";
    ?>

存取和修改字符串中的字符

字符串中的字符可以通过一个以0为开始的,用类似数组结构中的方括号对应的数字来查找和修改,比如$str[42,]可以把字符串相像数组.函数substr()和substr_replace()可以用来实现多于一个字符的情况.

Note:字符串为了同样的目的也可以用花括号,比如$str{42},但是,在PHP5.3.2中不推荐使用这种格式,应该用方括号,就像$str[42].

Warning

方括号中的数字超出范围将会产生空白.非整数类型被转换成整数,非整数类型转变成整数,非法类型会产生一个E_NOTICE级别错误,负数在写入时会产生一个E_NOTICE,但读取的是字符串。被指定的字符串只有第一个字符可用,空字符串用指定为空字节。

Example #8Some string examples

<?php

  //取得字符串的第一个字符

  $str='This is a test.';

  $first=$str[0];

  //取得字符串的第三个字符

  $str="This is still a test.";

  $last=$str[strlen($str)-1];

  //修改字符串的最后一个字符

  $str='Look at the sea'

  $str[strlen($str)-1]='e';

?>

Note:用[]或{}存取其它类型的变量只会返回NULL.

有用的函数和操作符

字符串可以用'.'(点)操作符连接起来,注意'+'(加号)操作符没有这个功能.

可以参考字符串函数了解大部分函数,高级的查找&替换功能可以参考正册表达式函数或perl类型的正册表达式函数.

另外还有URL字符串的函数,也有加密/解密字符串的函数.(mcrypt和mhash).

最后,可以参考字符类型函数.

转换成字符串

 一个值可以通过在其前面加上(string)或用strval()函数来转变字符串.在一个需要字符串的表达式中,

字符串会自动转变,比如在使用函数echo和print时,或在一个变量和一个字符串进行比较时,就会发生这种

转变类型和类型转换可以更好的解释下面事件,也可参考函数settype().

一个boolean TRUE值被转换成字符串"1".Boolean FALSE被转换成""(空的字符串).这种转变可以在boolean和字符串之间往返进行.

一个整数或浮点数被转变数字的字面样式的字符串(包括浮点中的指数部分),使用指数计数法的浮点数(4.1E+6)也可转变.

Note

 在脚本场所(category LC_NUMERIC)定义了小数点,更多可以参考函数setlocale().

数组转换成字符串"Array",因此,echo和print无法显示出该数组的值.如果显示一个数组值,可以用echo $arr['foo']这种结构,更多内容见下文.

在PHP 4对象被转换成字符串"Object",果为了调试原因需要打印出对象的值,方法见正文.为了得到对象的类的名称,可以用get_class()函数.

在PHP 5中,可以用_toString.资源总会被变成"Resource id #1"这种结构的字符串,其中的1是PHP分配给该资源的独特数字.不用过多关注这种

结构,它马上要转变了.为了得到一个resource类型,可以用函数get_resource_type().

NULL总是被转变成空的字符串.

如上面所说的,直接把数组,对象或资源转换成字符串 不会得到超出其自身的更多心信息。可以使用函数print_r()和var_dump()列出这些类型的内容.

大部分的PHP值可以转变成字符串S来长期存储,这被称作串行化,可以用函数serialize()来实现.如果PHP引擎设定支持WDDX,PHP值也可存储成XML格式.

字符串转变成数字

当一个字符串被用在了一个数字的环境中,结构和类型如下:

如果字符串没有包括'.','e'或'E'并且数字值符合整数类型的限定(PHP_INT_MAX定义的),这个字符串可被定义为一个integer,在其他情况下被认定为一个float.

字符串的开始部分给定了它的值,如果字符串的开始部分给定了它的值,如果字符串以合法的数字开始,这个数字可直接使用.否则,值就是0(零).合法数组由符号,后面跟着一个或多个数字(可能有个数点),再跟着可选的指数符号如'e'或'E',后面跟着一个或多个数字。

<?php

  $foo=1+"10.5";//$foo  is float

  $foo=1+"-1.3e3";//

  $foo=1+"bob-1.3e3";//

  $foo=1+"bob3";

  $foo=1+"10.2 Small Pigs";

  $foo=4+"10.2 Little Piggies";

  $foo="10.0 pigs"+1;

  $foo="10.0 pigs"+1.0;

?>

更多信息可以参考Unix手册中的strtod(3).

本节中的示例可以通过复制/粘贴到下面的代码中来显示:

<?php
  echo "\$foo==$foo; type is " gettype ($foo) . "<br />\n";
?>

数组
 PHP中的数组实际上是一个有序映射.映射是一种把values关联到keys的类型.此类型在很多方面做了优化,

因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性.

数组元素的值也可以是另一个数组.树形结构和多维数组也是允许的.

解释这些结构超出了这本手册的范围,但对于每种结构至少会提柜一个例子.要得到这些结构的更多信息,建议参考有关此广阔主题的其他著作.

语法

定义数组array()

可以用array()语言结构来新建一个array.它接受任意数量用逗号分隔的键(key)=>值(value)对.

array(key=>value

  ,...

)

//键(key)可以是一个整数(integer)或字符串(string)

//值(value)可以是任意类型的值

<?php

  $arr=array("foo"=>"bar",12=>true);

  echo $arr["foo"];//bar

  echo $arr[12];//1

  ?>

key可以是integer或者string.如果key是一个integer的标准表示,
则被解释为整数(例如“8”将被解释为8,而“08”将被解释为“08”).
key中的浮点数被取整为integer。在PHP中索引数组与关联数组是
相同的,它们都可以包含整型和字符串的下标。
值可以是任意的PHP类型。
<?php
  $arr=array("somearray"=>array(6=>5,13=>9,"a"=>42));
  echo $arr["somearray"][6];
  echo $arr["somearray"][13];
  echo $arr["somearray"]["a"];
?>
 

如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。

<?php
// 这个数组与下面的数组相同 ...
array(=> 433256"b" => 12);

// ...
array(=> 43=> 32=> 56"b" => 12);
?>
Warning

自 PHP 4.3.0 起,上述的索引生成方法改变了。如今如果给一个当前最大键名是负值的数组添加一个新值,则新生成的的索引将为零(0)。以前新生成的索引为当前最大索引加一,和正值的索引相同。

使用 TRUE 作为键名将使 integer 1 成为键名。使用 FALSE 作为键名将使 integer 0 成为键名。使用 NULL 作为键名将等同于使用空字符串。使用空字符串作为键名将新建(或覆盖)一个用空字符串作为键名的值,这和用空的方括号不一样。

不能用数组和对象作为键(key)。这样做会导致一个警告:Illegal offset type

用方括号的语法新建/修改

可以通过明示地设定值来改变一个现有的数组。

这是通过在方括号内指定键名来给数组赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号(“[]”)。

$arr[key] = value; $arr[] = value; // key 可以是 integerstring // value 可以是任意类型的值

如果 $arr 还不存在,将会新建一个。这也是一种定义数组的替换方法。要改变一个值,只要给它赋一个新值。如果要删除一个键名/值对,要对它用 unset()

<?php
$arr = array(=> 112 => 2);

$arr[] = 56;    // This is the same as $arr[13] = 56;
                // at this point of the script

$arr["x"] = 42// This adds a new element to
                // the array with key "x"
                
unset($arr[5]); // This removes the element from the array

unset($arr);    // This deletes the whole array
?>

Note:

如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值 + 1。如果当前还没有整数索引,则键名将为 0。如果指定的键名已经有值了,该值将被覆盖。

注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:

 <?php

  //创建一个数组
    $array=array(1,2,3,4,5);
    print_r($array);//输出:Array([0]=>1,[1]=>2,[2]=>3,[3]=>4,[4]=>5)
    //现在删除其中的所有元素,但保持数组本身不变
    foreach($array as $i=>$value)
    {
        unset($array[$i]);
    }
    print_r($array);//输出:Array()
    //添加一个单元(注意新的键名是5,而不是你可能以为的0)
    $array[]=6;
    print_r($array);//输出Array([5]=>6)
    //重新索引:
    $array=array_values($array);
    $array[]=7;
    print_r($array);//输出:Array([0]=>1,[1]=7)
    ?>

 

实用函数

有很多操作数组的函数

Note:

unset()函数允许删除数组中的某个键。但要注意数组将不会被重建索引。

<?php

  $a=array(1=>'one',2=>'two',3=>'three');

  unset($a[2]);//will produce an array that would have been defined as

         //$a=array(1=>'one',2=>'two',3=>'three');

         //and NOT

         //$a=array(1=>'one',)

   $b=array_values($a);

?>

foreach控制结构是专门用于数组的.它提供了一个简单的方法来遍历数组.数组做什么和不做什么?

为什么$foo[bar]错了?

应该始终在用字符串表示的数组索引加上引号。例如用$foo['bar']而不是$foo[bar]。但是为什么$foo[bar]错了呢?

<?php   

  $foo[bar]='enemy';

  echo $foo[bar];

  //etc

?>

这样是错的,但是可以正常运行.那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而PHP

可能会在以后定义此常量,不幸的是你的代码中有同样的名字.它能运行,是因为PHP自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成

一个值为该裸字符串的正常字符串.例如,如果没有常量定义此常量,PHP将把它替代为‘bar’并使用之。

Note:这并不意味着总是给键名加上引号,用不着给键名为常量或变量的加上引号,否则会使PHP不能解析它们。

<?php

  error_reporting(E_ALL);

  ini_set('display_errors',true);

  ini_set('html_errors',false);

//Simple array:

  $array=array(1,2);

  $count=count($array);

  for($i=0;$i<$count;$i++){

  echo "\nChecking $i:\n";

  echo "Bad:".$array['$i']."\n";

  echo "Good:".$array[$i]."\n";

  echo "Bad:{$array['$i']}\n";

  echo "Good:{$array[$i]}\n";

}

?>

以上例程会输出:

Checking 0:

Notice:Underfined index:$i in/path/to/script.html on line 9

Bad:

Good:1

Notice:Underfined index:$i in/path/to/script.html on line11

 Bad:

Good:1

 

Checking 1:

Notice:Underfined index:$i in/path/to/script.html on line 9

Bad:

Good:2

Notice:Underfined index:$i in/path/to/script.html on line 11

Bad:

Good:2

演示此行为的更多例子:

<?php

  //Show all errors

  error_reporting(E_ALL);

  $arr=array('fruit'=>'apple','veggie'=>'carrot');

  //Correct

  print $arr['fruit'];//apple

  print $arr['veggie'];//carrot

  //Incorrect.

  print $arr['fruit'];

  print $arr['veggie'];

  //Incorrect

  print $arr[fruit];

  print $arr[fruit];

  //

  print "Hello $arr{[fruit]}";

  //

  print "Hello {$arr[fruit]}";

  print "Hello {$arr['fruit']}";

  //

  print “Hello $arr['fruit']“;

  print "Hello $_GET['fruit']";

  //

  print "Hello".$arr['fruit'];

?>

当打开error_reporting 来显示E_NOTICE级别的错误(例如将其设为E_ALL)时将看到这些错误.默认情况下error_reporting将关闭不显示这些.

和在语法一节中规定的一样,在方括号("["和"]")之间必须有一个表达式.这意味着可以这样写:

<?php

  echo $arr[somefunc($bar)];

?>

这是一个用函数返回值作为数组索引的例子.PHP也可以用已知常量,可能之前已经见过

<?php

  $error_descriptions[E_ERROR]="A fatal error has occured";

  $error_descriptions[E_WARNING]="PHP issued a warning";

  $error_descriptions[E_NOTICE]="This is just an informal notice";

?>

注意E_ERROR也是个合法的标识符,就和第一个例子中的bar一样。但是上一个例子实际上和如下写法是一样的:

<?php

  $error_descriptions[1]="A fatal error has occured".

  $error_descriptions[2]="PHP issued a warning";

  $error_descriptions[3]="This is just an informal notice";

?>

因为E_ERROR等于1,等等.

那么为什么这样做不好?

也许有一天,PHP开发小组可能会想新增一个常量或者关键字,或者用户

可能希望以后在自己的程序中引入新的常量,那就有麻烦了.例如已经不能这样用empty和default这两个词了,因为他们是保留字.

Note:重申一次,在双引号字符串中,不给索引加上引号是合法的.因此"$foo[bar]"是合法("合法"的原文为valid.在实际测试中,这么做确实

可以访问数组的元素,但是会报一个常量未定义的notice。无论如何,强烈建议不要使用$foo[bar]这样的写法,而要使用$foo['bar']来

访问数组中元素.)至于为什么参见以上的例子和字符串中的变量解析中的解释.

转换为数组

对于任意类型:integer,float,string,boolean&resource,如果将一个值转换为数组,将得到一个仅有一个元素的数组(其下标为0),该元素

即为此标量的值.换句话说,(array)$scalarValue与array($scalarValue)完全一样.

<?php

  class A{

  private $A;

}

  class B extends A{

  private $A;

  public $AA;

}

var_dump((array) new B());

?>

The above will appear to have two keys named 'AA',although one of them is actually named '\0A\0A'.

将NULL转换到数组(array)会得到一个空的数组.

比较

可能使用array_diff()和数组运算符来比较数组.

Examples

PHP中的数组类型有非常多的用途,因此这里有一些例子展示数组的完整威力.

<?php
    //This:
    $a=array('color'=>'red',
             'taste'=>'sweet',
             'shape'=>'round',
             'name'=>'apple',
             4);
     $b=array('a','b','c');
     
     //...is completely equivalent with this:
     $a=array();
     $a['color']='red';
     $a['taste']='sweet';
     $a['shape']='round';
     $a['name']='apple';
     $a[]=4;
     
     $b=array();
     $b[]='a';
     $b[]='b';
     $b[]='c';
     //After the above code is executed,$a will be the array
     //array('color'=>'red','taste'=>'sweet','shape'=>'round','name'=>'apple',0=>4),and $b will be the array
     //array(0=>'a',1=>'b',2=>'c'),or simply array('a','b','c').
     ?>
     Example #1 Using array()
  <?php
  //Array as (property-)map
  $map=array('version'=>4,
          'OS'      =>'Linux',
         'lang'=>'english',
        'short_tags'=>true);
  //strictly numerical keys
  $array=array ( 7,
          8,
          0,
          156,
          -10);
  //this is the same as array(0=>7,1=>8,...)
  $switching=array(10,
            5=>6,
            3=>7,
            'a'=>4,
            '8'=>2,
            '02'=>77,
            0=>12);
  //empty array
  $empty=array();
  ?>
Example #2 集合
<?php
  $colors=array('red','blue','green','yellow');
  foreach($colors as $color){
    echo "Do you like $colors?\n";
}
?>
以上例程会输出:
Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?
直接改变数组的值在PHP 5中可以通过引用传递来做到.之前的版本需要采用变通的方法:
 
Example #3集合
<?
//PHP 5
foreach ($colors as &$color){
  $color=strtoupper($color);
}
unset($color);//ensure that following writes to $color will not modify the last array element
foreach ($colors as $key=>$color){
  $colors[$key]=strtoupper($color);
}
print_r($colors);
?>
以上例程会输出:
Array
(
  [0]=>RED
  [1]=>BLUE
  [2]=>GREEN
  [3]=>YELLOW
)
本例生成一个下标从1开始的数组.This example creates a one-based array.
 
Example #4 下标从1开始的数组
<?php
  $firstquarter=array(1=>'January','February','March');
  print_r($firstquarter);
?>
以上例程会输出:
Array
(
  [1]=>'January'
  [2]=>'February'
  [3]=>'March'
)
 
Example #5填充数组
<?php
  //fill an array with all items from a directory
$handle=opendir('.');
while (false!==($file=readdir($handle))){
  $files[]=$file;
}
closedir($handle);
?>
数组是有序的.也可以使用不同的排序函数来改变顺序.更多信息参见数组函数.可以用count()函数来数出数组中元素的个数.
Example #6数组排序
<?php
  sort($files);
  print_r($files);
?>
因为数组中的值可以为任意值,也可是另一个数组.这样可以产生递归或多维数组.
 
Example #7 递归和多维数组
<?php
  $fruits=array("fruits"=>array("a"=>"orange",
                   "b"=>"banana",
                  "c"=>"apple"),
          "numbers"=>array( 1,
                    2,
                    3,
                    4,
                    5,
                    6
                    ),
          "holes"=>array("first",
                    5=>"second",
                      "third")
);
  //Some examples to address values in the array above
echo $fruits["holes"][5];
echo $fruits["fruits"]["a"];
unset($fruits["holes"][0]);
  //Create examples to address values in the array above
$juices["apple"]["green"]="good";
?>
数组(Array)的赋值总是会涉及到值得拷贝.使用引用操作符通过引用来拷贝数组.
<?php
  $arr1=array(2,3);
  $arr2=$arr1;
  $arr2[]=4;
  
  $arr3=&$arr1;
  $arr2[]=4;
  
  $arr3=&$arr1;
  $arr3[]=4;
?>