php学习笔记2-数据类型

[参考php官方文档]

    PHP 支持8种基本的数据类型,变量的类型通常不是由程序员设定的,确切地说,是由 PHP 根据该变量使用的上下文在运行时决定的,即弱类型。


1.四种标量类型(基本类型)
(1)boolean(布尔型)
     最简单的类型,只能为TRUE或FALSE,两个都不区分大小写。要明确地将一个值转换成boolean,用(bool)或(boolean)来强制转换。但很多情况下不需要用强制转换,因为当运算符、函数或者流程控制结构需要一个 boolean参数时,该值会被自动转换。 
当转换为 boolean 时,以下值被认为是 FALSE: 
    布尔值 FALSE 自身 
    整型值 0 (零) 
    浮点型值 0.0 (零) 
    空字符串, 以及 字符串 "0" 
    不包括任何元素的数组
    不包括任何成员变量的对象(仅PHP 4.0 适用) 
    特殊类型 NULL (包括尚未设定的变量) 
    从没有任何标记(tags)的XML文档生成的SimpleXML对象 
所有其它值都被认为是 TRUE(包括任何资源)。 

(2)integer(整型)
    整型值可以使用十进制,十六进制或八进制表示,前面可以加上可选的符号(-或者+)。八进制表示数字前必须加上0(零),十六进制表示数字前必须加上0x。
    整型数的字长和平台有关,通常最大值是大约二十亿(32 位有符号)。PHP不支持无符号整数。Integer值的字长可以用常量PHP_INT_SIZE来表示,自PHP 4.4.0和PHP 5.0.5后,最大值可以用常量PHP_INT_MAX来表示。 
    如果给定的一个数超出了integer的范围,将会被解释为float。同样如果执行的运算结果超出了integer范围,
也会返回 float。 PHP 中没有整除的运算符,1/2 产生出 float 0.5,可以总是舍弃小数部分,或使用round()函数。

<?php
$large_number =  2147483647;
var_dump($large_number);
// 输出为:int(2147483647)

$large_number =  2147483648;
var_dump($large_number);
// 输出为:float(2147483648)

$large_number =  50000 * $million;
var_dump($large_number);
// 输出: float(50000000000)
?> 

    要明确地将一个值转换为integer,用(int)或(integer)强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个integer参数时,值会自动转换。还可以通过函数intval() 来将一个值转换成整型。 
    从布尔值转换:FALSE 将产生出0,TRUE将产生出1。 
    从浮点数转换:当从浮点数转换成整数时,将向零取整。如果浮点数超出了整数范围(通常为+/- 2.15e+9= 2^31),则结果不确定,因为没有足够的精度使浮点数给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知! 

(3)float(浮点型, 也称作 double)
    浮点数的字长和平台相关。

(4)string(字符串)
    一个字符串就是由一系列的字符组成,因此,一个字符就是一个字节。这就是说,一个字节只能有256种不同的变化,这也暗示了PHP无法原生支持Unicode。 
    
定义一个字符串的最简单的方法是用单引号把它包围起来 (标点符号 ')。  如果想要输出一个单引号,需在它的前面加个反斜线 (\)。在单引号前或在字符串的结尾处想要输出反斜线,输入两条 (\\)。注意,如果在任何其它的字符前加了反斜线,反斜线将会被直接输出。在单引号字符串中的变量和特殊含义的字符将不会被替换。 
<?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';
?> 
    如果字符串是包围在双引号(")中, PHP将对一些特殊的字符进行解析。
    第三种定义字符串的方法是用heredoc句法结构:<<<。在该提示符后面,要定义个标识符,然后是一个新行。接下来是字符串本身,最后要用前面定义的标识符作为结束标志。 结束时所引用的标识符必须在一行的开始位置, 而且,标识符的命名也要像其它标签一样遵守PHP的规则:只能包含字母、数字和下划线,并且不能用数字和下划线作为开头。Heredoc结构就象是没有使用双引号的双引号字符串, 这就是说在heredoc结构中引号不用被替换,但是上文中列出的字符 (\n等)也可使用。 变量将被替换,但在heredoc结构中字符串表达复杂变量时,要格外小心。 也可以把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';

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 "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A

    Nowdoc结构:就象heredoc结构类似于双引号字符串,Nowdoc结构是类似于单引号字符串的。Nowdoc结构很象heredoc结构,但是 nowdoc不进行解析操作 。 这种结构很适合用在不需要进行转义的PHP代码和其它大段文本。与SGML的 <![CDATA[ ]]> 结构是用来声明大段的不用解析的文本类似,nowdoc结构也有相同的特征。 

<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;

/* 含有变量的更复杂的示例 */
class foo
{
    public $foo;
    public $bar;

    function foo()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<'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
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

    一个nowdoc结构也用和heredocs结构一样的标记 <<<, 但是跟在后面的标志符要用 单引号括起来,就像<<<'EOT'这样。heredocs结构的所有规则也同样适用于nowdoc结构,尤其是结束标志符的规则。 

    注意:变量解析
    当字符串用双引号或heredoc结构定义时,其中的变量将会被解析。 这里共有两种语法规则:一种简单规则,一种复杂规则。简单的句法规则是最常用和最方便的,它可以用最少的代码在一个字符串中加入变量,数组 值,或对象属性。 复杂的句法规则是在PHP4以后加入的,被花括号包围的表达式是其明显标记。 
    简单句法规则:当PHP解析器遇到一个美元符号 ($) , 它会和其它很多解析器一样,去尽量形成一个合法的变量名。可以用花括 号来明确变量名的界线。 

<?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);
$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()}";
?> 
    存取和修改字符串中的字符:字符串中的字符可以通过一个以0为开始的,用类似数组结构中的方括号包含对应的数字来查找和修改,比如 $str[42], 可以把 字符串想像数组 。 函数 substr() 和 substr_replace()可以用来实现多于一个字符 的情况。 
<?php
// 取得字符串的第一个字符
$str = 'This is a test.';
$first = $str[0];

// 取得字符串的第三个字符
$third = $str[2];

// 取得字符串的最后一个字符
$str = 'This is still a test.';
$last = $str[strlen($str)-1]; 

// 修改字符串的最后一个字符
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?> 
    转换成字符串:一个值可以通过在其前面加上(string)或用strval()函数来转变成 字符串。在一个需要字符串的表达式中,字符串会自动转变,比如在使用函数 echo() 或 print() 时, 或在一个变量和一个字符串进行比较时,就会发生这种转变类型和类型转换。一个boolean TRUE 值被转换成 字符串"1"。 Boolean FALSE 被转换成"" (空的字符串), 这种转变可以在 boolean 和 字符串 之间往返进行,一个 整数或浮点数被转变为数字的字面样式的字符串(包括浮点数中的指数部分),使用指数计数法的浮点数(4.1E+6)也可转变。 
    当一个字符串被用在了一个数字的环境中,结果和类型如下: 
    如果字符串 没有包含 '.','e'或'E' 并且数字值符合整数类型的限定 ( PHP_INT_MAX定义的), 这个字符串 可被认定是一个integer,在其它情况下被认定为一个float。字符串的开始部分给定了它的值,如果字符串以合法的数字开始,这个数字可直接使用。 否则,值就是零。 合法数值由符号,后面跟着一个或多个数字(可能有个小数点),再跟着可选的指数符号如'e' 或 'E',后面跟着一个或多个数字。 
2. 复合类型

(1)array (数组)
    PHP 中的数组实际上是一个有序映射,映射是一种把 values关联到 keys 的类型。
    key可以是integer或string。如果key是一个integer的标准表示,则被解释为整数(例如 "8" 将被解释为 8,而 "08" 将被解释为 "08"),key中的浮点数被取整为integer。在PHP中索引数组与关联数组是相同的,它们都可以同时包含整型和 字符串的下标。 
    值可以是任意的 PHP 类型。如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。不能用数组和对象作为键(key),unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。
    使用 TRUE 作为键名将使 integer 1 成为键名。使用 FALSE 作为键名将使 integer 0 成为键名。使用 NULL 作为键名将等同于使用空字符串。使用空字符串作为键名将新建(或覆盖)一个用空字符串作为键名的值,这和用空的方括号不一样。

<?php
// 创建一个简单的数组
$array = array(1, 2, 3, 4, 5);
print_r($array);

// 现在删除其中的所有元素,但保持数组本身不变:
foreach ($array as $i => $value) {
    unset($array[$i]);
}
print_r($array);

// 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
$array[] = 6;
print_r($array);

// 重新索引:
$array = array_values($array);
$array[] = 7;
print_r($array);
?> 

以上例程会输出:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)
(2)object(对象)
    要创建一个新的对象 object, 使用 new 语句实例化一个类,如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会实例化一个内置类 stdClass 的对象。如果该值为 NULL,则新的实例为空。数组转换成对象将使键名成为属性名并具有相对应的值。对于任何其它的值,名为 scalar 的成员变量将包含该值。

3. 特殊类型
(1)resource(资源)
    资源是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。由于 PHP4 Zend 引擎引进了引用计数系统,可以自动检测到一个资源不再被引用了(和 Java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存。

(2)NULL(NULL)
    特殊的NULL值表示一个变量没有值。NULL类型唯一可能的值就是NULL,大小写不敏感(可以写成null)。 
    在下列情况下一个变量被认为是 NULL: 
    被赋值为 NULL。 
    尚未被赋值。 
    被 unset()。 

你可能感兴趣的:(PHP,数据类型)