PHP - 数据类型

前言

PHP 支持 10 种原始数据类型。

四种标量类型:

  • bool - 布尔型
  • int - 整形
  • float - 浮点型 (也称 double、双精度)
  • string - 字符串

四种复合类型:

  • array - 数组 (本人认为是PHP最强大之处)
  • object - 对象
  • callable - 可调用
  • iterable - 可迭代

两种特殊类型:

  • resource - 资源
  • null - 空

数据类型

【1】、boolean - 布尔类型

取值范围

仅可取值范围为:true、false。

注意
需要注意的是值转换成 boolean 时候,部分值是被转化为 false, 其余的都为 true。以下情况在发生类型转化时候会被转化为 false :

  • 布尔值 false 本身。
  • 整型值 0(零)及 -0 (零)。
  • 浮点型值 0.0(零)-0.0(零)。
  • 空字符串,以及字符串 “0”。
  • 不包括任何元素的数组。
  • 特殊类型 NULL(包括尚未赋值的变量)。
  • 从空标记生成的 SimpleXML 对象。
【2】、integer - 整型

取值范围

int 是集合 ℤ = {…, -2, -1, 0, 1, 2, …} 中的某个数。

PHP 不支持无符号的 int。int 值的字长可以用常量 PHP_INT_SIZE来表示, 最大值可以用常量 PHP_INT_MAX 来表示, 最小值可以用常量 PHP_INT_MIN 表示。

进制表示

整型值 int 可以使用十进制,十六进制,八进制或二进制表示:

  • 八进制表达,数字前必须加上 0。
  • 十六进制表达,数字前必须加上 0x。
  • 二进制表达,数字前必须加上 0b。

整数溢出

整型数 int 的字长和平台有关,在 32 位操作系统为 2^31 位有符号; 在 64 位操作系统为 2^63 位有符号。

但如果给定的一个数超出了 int 的范围,将会被解释为 float。同样如果执行的运算结果超出了 int 范围,也会返回 float。

转换为整型

1)从布尔值转换 。

  • false 为 0,true 为 1。

2)从浮点型转换。

  • 向下取整。

3)从字符串转换 。

  • 如果字符串是数字或前导数字,则它将解析为相应的整数值,否则将转换为 0。

4)从 NULL 转换。

  • 恒为 0。
【3】、Float - 浮点型

解释

浮点型(也叫浮点数 float,双精度数 double 或实数 real)

精度

PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。

*不要比较两个浮点数是否相等,可能不是你期待的结果。

【4】、String - 字符串

解释

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

可以理解为PHP一个字节数组,所以可以使用下标去获取元素。字符串类型的此特性解释了为什么 PHP 中没有单独的“byte”类型 - 已经用字符串来代替了。

总所周知 PHP 是使用 C 语言实现的, C 语言并不是二进制安全的。但是 PHP 却是二进制安全的,这是因为 PHP 的字符串结构体是这样的。

struct{
    char *val;
    int len;  en表示该字符串的长度,无论是否遇到“\0”字符,都按照len长度读取该字符串。 
} str;

这里和 Redis 的 SDS 有着异曲同工之处,可以看这篇博文 《SDS - 简单动态字符串》。

**语法 **

一个字符串可以用 4 种方式表达:

  • 单引号

    单引号字符串中的变量和特殊字符的转义序列将不会被替换。

  • 双引号

    用双引号定义的字符串最重要的特征是变量会被解析。

  • heredoc 语法结构 ,作用类似于双引号字符串。

    用 heredoc 句法结构:<<<。在该运算符之后要提供一个标识符,然后换行。接下来是字符串 string 本身,最后要用前面定义的标识符作为结束标志。

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

  • nowdoc 语法结构,作用类似于单引号字符串的。

    Nowdoc 结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作。这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。
    一个 nowdoc 结构也用和 heredocs 结构一样的标记 <<<, 但是跟在后面的标识符要用单引号括起来,即 <<<‘EOT’。

【5】、Array - 数组

解释

PHP 最强大之处,我理解就是Array。不同也其他的语言有数据、切片、list、map,在 PHP 中 Array就能实现这些数据结构的功能,当然带来的弊端就是 PHP 的数组很占内存。所谓是成也萧何、败也萧何。

PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。

语法

可使用 array() 或者 [],声明一个数组。

类型

分为两种类型:索引数组和关联数组。

  • key 可以是 integer 或者 string。value 可以是任意类型。
  • 对于同一个键名,后者覆盖前者。
  • 可混合 integer 和 string 键名。
  • key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。

遍历

  • 遍历数组的顺序, 是和元素的添加先后相关的。
  • 按顺序遍历索引数组应该使用for, 而不是foreach。
【6】、Iterable - 可迭代对象

解释

Iterable是 PHP 7.1 中引入的一个伪类型。它接受任何 array 或实现了 Traversable 接口的对象。这些类型都能用 foreach 迭代, 也可以和 生成器 里的 yield from 一起使用。

语法

iterable $iterable。

用法

  • 迭代对象还可以用作返回类型,表示函数将返回一个可迭代的值。 如果返回值不是数组或 Traversable 的实例,则会抛出一个 TypeError。
  • 声明为可迭代的参数可能会使用 null 或者一个数组作为默认值。
【7】、Object - 对象

初始化

  • 建一个新的对象 object,需使用 new 语句实例化一个类。
  • new \stdClass。
【8】、Resource - 资源类型

解释

资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。比如:curl、fopen等等。

注意

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

【9】、NULL

解释

特殊的 null 值表示一个变量没有值。NULL 类型唯一可能的值就是 null。 null 类型只有一个值,就是不区分大小写的常量 null。

以下情况为 null :

  • 被赋值为 null。
  • 尚未被赋值。
  • 被 unset()。
【10】、Callback / Callable - 类型

解释

HP 5.4 起可用 callable 类型指定回调类型 callback。一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。

传递

PHP 是将函数以string形式传递的。 可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。

举例

1)、回调函数示例

<?php 

=function my_callback_function() {
    echo 'hello world!';
}

//  一个示例回调方法
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello World!';
    }
}

//  简单回调
call_user_func('my_callback_function'); 

//  静态类方法调用
call_user_func(array('MyClass', 'myCallbackMethod')); 

//  对象方法调用
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

//  静态类方法调用 ( PHP 5.2.3 以后)
call_user_func('MyClass::myCallbackMethod');

//  相对静态类方法调用 (PHP 5.3.0 以后)
class A {
    public static function who() {
        echo "A\n";
    }
}

class B extends A {
    public static function who() {
        echo "B\n";
    }
}

call_user_func(array('B', 'parent::who')); // A

//  实现 __invoke 的对象可以用作可调用对象 ( PHP 5.3 以后)
class C {
    public function __invoke($name) {
        echo 'Hello ', $name, "\n";
    }
}

$c = new C();
call_user_func($c, 'PHP!');

2)、使用 Closure 的示例。

<?php

$double = function($a) {
    return $a * 2;
};

$numbers = range(1, 5);

$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooddance

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值