[PHP中文手册][二.语言参考-类型]

[PHP中文手册][二.语言参考-类型]

标签(空格分隔): 未分类


类型

简介

四种标量类型

  • boolean 布尔
  • integer 整型
  • float 浮点型,与double其实一致
  • string 字符串

两种复合类型

  • array 数组
  • object 对象

两种特殊类型

  • resource 资源
  • null 无类型

三种伪类型

  • mixed 混合类型
  • number 数字类型
  • callback 回调类型
  • $… 伪变量

变量的类型通常不是由程序员设定的,确切地说,是由 PHP 根据该变量使用的上下文在运行时决定的。


$a_bool = TRUE;   // a boolean
$a_str  = "foo";  // a string
$a_str2 = 'foo';  // a string
$an_int = 12;     // an integer

echo gettype($a_bool); // prints out:  boolean
echo gettype($a_str);  // prints out:  string

// If this is an integer, increment it by four
if (is_int($an_int)) {
    $an_int += 4;
}

// If $bool is a string, print it out
// (does not print out anything)
if (is_string($a_bool)) {
    echo "String: $a_bool";
}
?>
  • var_dump()查看变量的类型和值
    image_1asbrijv71djd19vot9e6vq10d99.png-1.2kB
  • gettype() 查看变量的类型
  • is_type() 来进行类型判断
  • settype() 来jin

    Boolean 类型

    • ture,false大小写随意
    • 其余与普通语言基本相同,比如其他类型强制转换Bool的规则。

Integer 类型

进制


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

最大值

最大值可以用常量 PHP_INT_MAX 来表示,和C差不多。

整除

没有整除,只能通过(int)(integer)强制转化。

Float 浮点型

浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:


$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;
?>

image_1ascvcmkb4b426g1bh83ga1t1l9.png-18.5kB

NaN

某些数学运算会产生一个由常量 NAN所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值进行的松散或严格比较的结果都是 FALSE。 由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。


String

一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode 。详见字符串类型详解。

语法

  • 单引号
  • 双引号
  • heredoc 语法结构
  • nowdoc 语法结构

单引号

  • 表达单引号本身需要 /'
  • 表达/ 需要//
  • 其余斜杠在单引号表示中没有转义的含义.
  • 变量也不会被解释'$temp'

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';
?>

双引号

  • 对类似\n的转义符号解析。
  • 能进行变量解析

    比如 echo "$haha" 会输出哈哈的值

heredoc结构

  • 使用<<<开头,后面提供一个标示符,然后换行,接下来是string本身,最后用前面定义的标示符作为结束标志。结束的标示符必须在该行的第一列,并且之后只能有分号。

  • 能够解析变量

  • 在PHP 5.3.0之后,也可以用heredoc结构来初始化静态变量和类的属性和常量。


// 静态变量
function foo()
{
      
    static $bar = <<
  • 自 PHP 5.3.0 起还可以在 Heredoc 结构中用双引号来声明标识符。
    
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>

newdoc 结构

  • heredoc类似双引号,newdoc类似单引号,newdoc不能进行解析和转义

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

  • 不象heredoc 结构,nowdoc结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量:


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

变量解析

简单语法

-当 PHP 解析器遇到一个美元符号($)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线。

复杂(花括号)语法

  • 只有 $紧挨着 { 时才会被识别
$great = 'fantastic';

// 无效,输出:This is { fantastic},花括号未被转义
echo "This is { $great}";
// 有效,输出: This is fantastic
echo "This is {
     $great}";
echo "This is ${great}";

$name='zhouyong';
$zhouyong='hahaha';
echo "This is the value of the var named $name: {
     ${$name}}";
//输出This is the value of the var named zhouyong: hahaha

// 有效,只有通过花括号语法才能正确解析带引号的键名
echo "This works: {
     $arr['key']}";
  • 也可以在字符串中用此语法通过变量来调用类的属性。

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";
?>

有用的函数和运算符

  • 字符串可以用 ‘.’(点)运算符连接起来,注意 ‘+’(加号)运算符没有这个功能。更多信息参考字符串运算符。

可以参考字符串函数了解大部分函数,高级的查找与替换功能可以参考正则表达式函数或 Perl 兼容正则表达式函数。 另外还有 URL 字符串函数,也有加密/解密字符串的函数(mcrypt 和 mhash)。
最后,可以参考字符类型函数。


$test= "hello"."world";
var_dump($test);
//print "helloworld"
?>
  • 关于强制转换成字符串

    一个值可以通过在其前面加上 (string)或用 strval()函数来转变成字符串。在一个需要字符串的表达式中,会自动转换为 string。比如在使用函数 echo 或 print时,或在一个变量和一个 string 进行比较时,就会发生这种转换

    • 一个布尔值 booleanTRUE 被转换成 string 的 "1"。Boolean 的 FALSE 被转换成""(空字符串)。这种转换可以在 boolean和 string 之间相互进行。
    • 一个整数 integer 或浮点数 float 被转换为数字的字面样式的 string(包括 float中的指数部分)。使用指数计数法的浮点数(4.1E+6)也可转换。
    • 数组 array 总是转换成字符串 "Array",因此,echo 和 print 无法显示出该数组的内容。要显示某个单元,可以用 echo $arr[‘foo’] 这种结构。要显示整个数组内容见下文。
    • 在 PHP 4 中对象 object 总是被转换成字符串 "Object",如果为了调试原因需要打印出对象的值,请继续阅读下文。为了得到对象的类的名称,可以用 get_class() 函数。自 PHP 5 起,适当时可以用 __toString 方法。
    • 资源 resource 总会被转变成 "Resource id #1" 这种结构的字符串,其中的 1 是 PHP 在运行时分配给该 resource 的唯一值。不要依赖此结构,可能会有变更。要得到一个 resource 的类型,可以用函数 get_resource_type()。
    • NULL 总是被转变成空字符串。

    如上面所说的,直接把 array,object 或 resource转换成 string 不会得到除了其类型之外的任何有用信息。可以使用函数 print_r() 和 var_dump() 列出这些类型的内容。

  • 字符串转换为数字

    • 如果没有.,e,E,将转换为interger,否则为float
    • 非法的转换将返回0
    • 不能像C语言一样 'A'=65,要通过ord()chr()实现
$foo = 1 + "10.5";                // $foo is float (11.5)
$foo = 1 + "-1.3e3";              // $foo is float (-1299)
$foo = 1 + "bob-1.3e3";           // $foo is integer (1)
$foo = 1 + "bob3";                // $foo is integer (1)
$foo = 1 + "10 Small Pigs";       // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1;          // $foo is float (11)
$foo = "10.0 pigs " + 1.0;        // $foo is float (11)     
?>

要特别注意PHP的编码问题


Array 数组

PHP的Array实际上是一个key映射到value的字典,所以既能作为数组,也能作为字典。

语法

key => value


$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// 自 PHP 5.4 起
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
$array = [1,2,3]
?>

注意:key有些特殊的规则。

  • 包含有合法整型值的字符串会被转换为整型。例如键名"8" 实际会被储存为 8。但是 "08"则不会强制转换,因为其不是一个合法的十进制数值(八进制)。
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。

  • key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。

1    => "a",
    "1"  => "b",
    1.5  => "c",
    true => "d",
    "haha",
    "eeee",
    8 => "ddddd",
    "11111111111",
);
var_dump($array);
/*print:
D:\wamp64\www\1.php:12:
array (size=5)
  1 => string 'd' (length=1)
  2 => string 'haha' (length=4)
  3 => string 'eeee' (length=4)
  8 => string 'ddddd' (length=5)
  9 => string '11111111111' (length=11)
*/
?>

数组的间接引用

自 PHP 5.4 起可以用数组间接引用函数或方法调用的结果。之前只能通过一个临时变量。


function getArray() {
     
    return array(1, 2, 3);
}

// on PHP 5.4
$secondElement = getArray()[1];

// previously
$tmp = getArray();
$secondElement = $tmp[1];

// or
list(, $secondElement) = getArray();
?>

数组的修改,增删。




$arr = array(5 => 1, 12 => 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
?>

NOTICE

  • 对于未指定key的赋值,不一定是当前数组里最大的整数+1。有可能是之前的。

// 创建一个简单的数组
$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);
?>

其余类型转换为数组

对于任意 integerfloatstringbooleanresource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)$scalarValuearray($scalarValue) 完全一样。

如果一个 object 类型转换为array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:

  • 整数属性不可访问;
  • 私有变量前会加上类名作前缀;
  • 保护变量前会加上一个 '*' 做前缀。
  • 这些前缀的前后都各有一个 NULL(/0) 字符。这会导致一些不可预知的行为:

数组的遍历


// Array as (property-)map
$map = array( 'version'    => 4,
              'OS'         => 'Linux',
              'lang'       => 'english',
              'short_tags' => true
            );

foreach ($map as $maps) {
     echo $maps." ";
 } 
foreach ($map as $key=>$maps) {
     echo $maps." ".$key." ";
 } 
for ($i = 0; $i < $count; $i++) {
}
?>
//4 Linux english 1
//4 version Linux OS english lang 1 short_tags

数组排序


sort($files);
print_r($files);
?>

数组的复制

$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed,
             // $arr1 is still array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4; // now $arr1 and $arr3 are the same
?>

Object对象

对象初始化

要创建一个新的对象 object,使用 new 语句实例化一个类:


class foo
{
     
    function do_foo()
    {
     
        for($i=0;$i<=10;$i++){
        echo "Doing foo."."\n";
        }
    }
} 

$bar = new foo;
$bar->do_foo();
?>

对象的强制转换

  • 如果将一个对象转换成对象,它将不会有任何变化。

  • 如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例

    • 如果该值为 NULL,则新的实例为空
    • 数组转换成对象将使键名成为属性名并具有相对应的值。
    • 对于任何其它的值,名为 scalar 的成员变量将包含该值。

Resource 资源类型

资源 resource是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。所有这些函数及其相应资源类型见附录。

转换为资源

由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。

释放资源

由于 PHP 4 Zend 引擎引进了引用计数系统,可以自动检测到一个资源不再被引用了(和 Java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存。

Callback 回调类型

本文档使用的伪类型

mixed

mixed 说明一个参数可以接受多种不同的(但不一定是所有的)类型。

number

number 说明一个参数可以是 integer 或者 float。

callback

本文档中在 PHP 5.4 引入 callable 类型之前使用 了 callback 伪类型。二者含义完全相同。

void

void 作为返回类型意味着函数的返回值是无用的。void作为参数列表意味着函数不接受任何参数。

在函数原型中,$… 表示等等的意思。当一个函数可以接受任意个参数时使用此变量名。

你可能感兴趣的:(PHP)