PHP学习记录【php数据类型】

这篇博客详细介绍了PHP中的八种数据类型:布尔型、字符串、整型、浮点型、数组、对象、资源和空值。重点讲解了每种类型的特点、使用场景以及示例,特别是布尔型与字符串类型的细节,包括它们的定义方式、转义字符和变量解析的差异。此外,还提到了PHP中变量的数据类型是由运行时自动识别的,无需程序员预先设定。

在PHP中,一共支持八种原始数据类型:他们是四种标量类型:boolean(布尔型),integer(整形),float(浮点型)和string(字符串型);两种复合数据类型:array(数组)和object(对象);两种特殊数据类型:resource(资源)与空值(null)。
PHP中变量的数据类型通常不是由程序员设定的,准确的说,是PHP根据该变量使用的上下文在运行时决定的,简单的说就是,我们不需要设定变量的数据类型,PHP会自动识别。

数据类型描述
boolean(布尔型)也叫bool型,布尔型是最简单的数据类型,只有两个值 false(假) 和true(真) ,不区分大小写
string(字符串型)字符串就是连续的字符序列,由数字、字母和符号组成。如 ehco “string”;
integer(整型)整型数据类型只能包含整数,这些数据类型可以是负数或者正数
float(浮点型)浮点型类型用于存储整数数字,和整型不同的是浮点型可以有小数点
array(数组)数组是一组数据的组合,它把一系列的数组组合起来,形成一个可操作的整体
object(对象)对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位,一个对象由一组属性和对这组属性进行操作的一组服务组成
resource(资源)资源是一种特殊的变量,保存在外部资源的一个应用,资源是通过函数来进行建立的,如打开文件、数据库连接,图形画布区域等
null( 空白)特殊的值,表示变量没有值,任何变量的初始值都是null

一、布尔型(boolean)数据类型

布尔型是PHP四种标量数据类型中的一个,它是PHP中较为常见的数据类型之一,它只能保存两个值:true值和false值。它不区分大小写,所以true写成TRUE是一样的。

如果我们需要设定一个布尔型的变量,只需将true值或者false值直接赋值给变量就好,如下:

$a=true;
$b=false;

实例
通常,布尔型变量是应用在条件控制或循环控制语句的表达式中,下面在if条件控制语句中判断变量$ boo中的值是否为true,如果为true,则输出"变量 $boo为真!",否则输出"变量 $boo为假!",代码如下:

<?php
header("Content-type:text/html;charset=utf-8");              //设置编码
$boo=true;                         //说明一个boolean类型变量,赋初值为true
if($boo==true){                    //判断$boo变量是否为真
echo "变量\$boo为真!";
}else{
echo "变量\$boo为假!";
}
?>

代码运行结果:

变量$boo为真!

注意:在PHP中不是只有boolean值为假,在一些特殊情况下非boolean值也被认为是假。这些特殊情况为:0,0.0,“0”,空白字符串(“”),只声明没有赋值的数组等。
下面是这些特殊情况的示例:

  1. 变量的值为整型时,如果值为0时为假,其他为真。
<?php
var_dump(1 == true); //bool(true)
var_dump(0 == false); //bool(true)
var_dump(-1 == false); //bool(false)
var_dump(0 == true); //bool(false)
?>

  1. 变量的值为浮点型时,如果值为0.00(即其中只有0)
    即为假,其他都为真:
<?php
var_dump(1 == true); //bool(true)
var_dump(0 == false); //bool(true)
var_dump(-1 == false); //bool(false)
var_dump(0 == true); //bool(false
?>
  1. 变量值为字符串时,如果值为“”(即空)或0即为假,其它都为真(既使为0.00或“ ”中间有空格也是真):
<?php
var_dump("" == false); //bool(true)
var_dump("0" == false); //bool(true)
var_dump(" " == true); //bool(true)
var_dump("0.00" == true); //bool(true)
?>
  1. 变量为数组型时,如果数组中没有任何成员,即为假,否则为真。
<?php
var_dump(array() == ''); //bool(false)
var_dump(array() === ''); //bool(false)
var_dump(array() == NULL); //bool(true)
var_dump(array() === NULL); //bool(false)
var_dump(array() == 0); //bool(false)
var_dump(array() === 0); //bool(false)
var_dump(array() == false); //bool(true)
var_dump(array() === false); //bool(false)
var_dump(array() == true); //bool(false)
var_dump(array() === true); //bool(false)
?>

二、字符串(string)数据类型

字符串就是连续的字符序列,由数字,字母和符号组成。在字符串的每个字符只占用一个字节。

在PHP中,有三种定义字符串的方式,分别是单引号(’),双引号(“)和定界符(<<<)。

单引号和双引号是经常被使用定义字符串的方式,定义如下:

单引号:

<?php
$a='网络安全';
?>

双引号:

<?php
$a="网络安全";
?>

单引号和双引号的不同之处就在双引号所包含的变量会自动的被替换成实际数值,而单引号所包含的的变量则按普通的字符创输出,我们下面来一下示例

单引号和双引号定义字符串不同之处的示例

<?php
header("Content-type:text/html;charset=utf-8");              //设置编码
$i='网络安全';                                              //声明一个字符串变量
echo "$i";                                                   //用双引号输出
echo "<p>";                                                  //输出短标记
echo '$i';                                                   //用单引号输出
?>

示例运行结果如下:

网络安全
$i

示例详解:

在这个示例中,我们分别使用单引号和双引号输出同一个变量,但是输出的结果完全不同,从上图就能看出,我们使用双引号输出的结果是变量的值,而使用单引号输出的是字符串“$i”。

除了上面的不同点之外,再有就是两者对转义字符的使用不不同。使用单引号是,只要对单引号“ ’ ”进行转移即可,但使用双引号(")时,还要注意“ " ”、“$”等字符的使用,这些特殊字符都要通过转义符“\”来显示,常用的转义字符如下表:

常用的转义字符

转义字符输 出
\n换行
\r回车
\t水平制表符
\反斜杠
$美元符号
单引号
"双引号
[0-7]{1,3}正则表达式匹配一个八进制符号表示的字符
\x[0-9A-Fa-f]{1,2}正则表达式匹配一个十六进制符号表示的字符

这里有一点要注意的是,这里有一点要注意的是,\n和\r在Windows系统中没有什么区别,都可以当作回车符。但是在Linux系统中则是两种效果,在Linux中,\n表示换到下一行,却不会回到行首;而\r表示光标回到行首,但仍然在本行,如果有使用Linux操作系统的,可以尝试一下。
如果我们对非转义字符使用了“\”,那么在输出时,“\”也会跟着一起被输出。在定义一些简单的字符串是,使用单引号是一个更好的处理方式。如果使用双引号,PHP将花费一些时间来处理字符串的转义和变量的解析,因此,在定义字符串时,如果没有特别的要求,我们最好使用单引号

双引号和单引号有什么区别

1.双引号解析变量,但是单引号不解析变量。
2.在双引号里面插入变量,变量后面如果有英文或中文字符,它会把这个字符和变量拼接起来,视为一整个变量。一定要在变量后面接上特殊字符,例如空格等分开。
3.如果在双引号里面插变量的时候,后面不想有空格,可以拿大括号将变量包起来。
4.双引号解析转义字符,单引号不解析转义字符。但,单引号能解析’ 和
5.单引号效率高于双引号,尽可能使用单引号
6.双号和单引号可以互插!!!双引号当中插入单引号,单引号当中插入变量,这个变量会被解析。
7.神奇的字符串拼接胶水——(.)点,用来拼接字符串。
8.我们将定界符声明字符串视为双引号一样的功能来看待。

界定符

界定符(<<<)是从PHP4.0开始支持的。在使用后接一个标识符,然后是字符串,最后是同样的标识符结束字符串。界定符的格式如下:

$string=<<< str

 要输出的字符串

str

其中,str为指定的标识符

界定符示例

代码如下:

<?php
header("Content-type:text/html;charset=utf-8");              //设置编码
$i='PHP中文网';                                              //声明一个字符串变量
echo <<<std
这和双引号没什么区别,\$i同样可以被输出出来。<p>
\$i的内容为:$i
std
?>

代码运行结果:

这和双引号没什么区别,$i同样可以被输出出来。
$i的内容为:PHP中文网

实例详解:

在上面的示例中,我们使用了界定符输出变量的值,可以看到它和双引号没什么区别,包含的变量也被替换成实际数值。
结束标识符必须单独另起一行,并且不允许有空格。在标识符前后有其他字符或符号,也会发生系统错误,包括注释。

结束标识符必须单独另起一行,并且不允许有空格。在标识符前后有其他字符或符号,也会发生系统错误,包括注释。

三、整型(integer)数据类型

整型数据类型就是我们常说的整数,它只能是整数,像我们写过123456,我的年龄20,这都是一个整型,或者-123456,这都代表整型,这些我们写的都是十进制的,还可以写八进制的数,十六进制的,这都代表整型。如果使用八进制表示,数字前面必须加0,如果用十六进制,需要加0x.

整型是要有一个有效范围的,有效范围是-2447483648~+2147483647

既然有存储范围了,那我们现在说两个整型相加一定等于整形吗不一定,因为超过了整型的存储范围呢会产生一种现象,叫做溢出的现象,什么意思呢就拿我们说,拿一个一升的杯子,你要装十升的水,那肯定装不下啊就往外冒了,那既然你想装下十升的水,你只能拿一个更大的容器来装就可以。所以,当给定的数值超出了int型所能表达的最大范围时,将会被当做float型处理,浮点类型它的存储范围比整型大。

如果在八进制中出现了非法数字(8和9),则后面的数字会被忽略掉。

整型——整数也,英文称之:integer。英文简写:int

整型分为:
10进制
8进制
16进制
整型(整数)在计算机里面是有最大值和最小值范围的。

10进制声明:

<?php
//为了方便大家记忆和前期学习,英文不好的朋友也可用拼音来声明变量。以后再用英文来声明变量也无所谓
//声明变量 整数,英文 int
//$int=1000;
$zhengshu=1000;
echo $zhengshu;
?>

8进制声明:以0开始,后面跟0-7的整数

<?php
//8进制的取值范围最大为0-7,即0,1,2,3,4,5,6,7
$bajingzhi = 033145;
echo $bajingzhi;
?>

16进制声明:以0x开始,后面跟0-f的,0x的abcdef不区分大小写。

<?php
//16进制的取值范围最大为0-f,即0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
$shiliu = 0x6ff;
echo $shiliu;
?>

整型数据类型示例

在下面的示例中,会分别输出八进制,十进制和十六进制的结果:代码如下

<?php
header("Content-type:text/html;charset=utf-8");              //设置编码
$str1=1234567890;                                        //说明一个十进制整数
$str2=0x1234567890;                                      //说明一个十六进制的整数
$str3=01234567;                                       //说明一个八进制的整数
$str4=01234567;                                          //说明另一个八进制的整数
echo '数字1234567890不同进制的输出结果:<p>';
echo '十进制的结果是:'.$str1.'<br/>';                      //输出十进制整数
echo '十六进制的结果是:'.$str2.'<br/>';                    //输出十六进制整数
echo '八进制的结果是:';
if($str3==$str4){                                            //判断$str3和$str4的关系
echo '$str3=$str4='.$str3;
}else{
echo '$str3!=$str4';
}
?>

代码运行结果:

数字1234567890不同进制的输出结果:
十进制的结果是:1234567890
十六进制的结果是:78187493520
八进制的结果是:str3=str3=str3=str4=342391

四、浮点(float)数据类型

浮点数据类型就是我们常见的小数,想“0.7”,“100.2”这些都是浮点型数据,浮点数据类型既可以用来存储整数,也可以存储小数。它比我们前面讲的整型数据类型的精度要高。

浮点型的有效范围是1.8E-308~1.8E+308。

在PHP4.0之前,浮点型的标识为double,也叫做双精度浮点数,两者没有什么区浮点数据类型就是我们常见的小数,想“0.7”,“100.2”这些都是浮点型数据,浮点数据类型既可以用来存储整数,也可以存储小数。它比我们前面讲的整型数据类型的精度要高。

浮点型的有效范围是1.8E-308~1.8E+308。

在PHP4.0之前,浮点型的标识为double,也叫做双精度浮点数,两者没有什么区别

声明方式分为两种:普通声明和科学声明

浮点型数据默认有两种书写格式,一种为标准格式,如下

3.1415
-35.8

还有一种科学计数法格式

3.14*10^3 可以使用3.14e3来表示

浮点(float)数据类型示例

<?php
//声明变量fudian的值为12121.3132
$fudian = 12121.3132;
echo $fudian;
?>

代码运行结果

12121.3132

在下面的例子中,我们将测试不同的数字。PHP var_dump()会返回变量的数据类型和值:

<?php
$x = 10.3605;
var_dump($x);
echo "<br/>";
$x = 2.4e3;
var_dump($x);
echo "<br/>";
$x = 8E-5;
var_dump($x);
?>

代码运行结果如下:

float(10.3605)
float(2400)
float(8.0E-5)

浮点型的数据只是一个近似的值,所以要尽量避免浮点型数值之间的比较大小,因为最后的结果都是不准确的

<?php
$a=0.1;
$b=0.7;
if(($a+$b)==0.8){
echo "true";
}else{
echo 'false';
}
?>

代码运行结果如下:

false

五、数组(array)数据类型

数组是一组数据的集合,它把一系列的数据组织起来,形成一个可操作的整体。数组中可以包含很多数据,如标量数组,对象,资源以及PHP中支持的其他语法结构等。

数组中的每一个数据称为一个元素,元素包括索引(键名)和值两部分,元素的索引可以由数字或字符串组成,元素的值可以是多种数据类型,定义数组的语法格式如下:

可以用array()语言结构来新建一个数组。每个数组元素之间使用逗号分隔。

$array=('value1','value2'......)

$array[key]='value'

$array=array(key1=>value1,key2=>value2......)

参数详解:

参数key是数组元素的下标,value是数组下标所对应的元素。

自5.4起可以使用短数组定义语法,用[ ]替代array()

以前定义数组是这样

<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);
?>

自PHP5.4起可以这样

<?php
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
?>

数组的定义示例

以下的几种都是正确的格式

<?php
$arr1=array('This','is','a','example');
$arr2=array(0=>'PHP',1=>'网络安全');
$arr3[0]='tmpname';
?>

数组的元素个数是可以更改的,只要给数组赋值,数组就会自动增加长度。

六、对象(object)数据类型

对象是存储数据和有关如何处理数据的信息的数据类型。是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。

语法

在 PHP 中,必须明确地声明对象。

首先我们必须声明对象的类。我们使用关键字 class 来声明一个类,后面紧跟类的名字,主体用 {} 符号括起来,像下面这样

class class_name{
    ......
}

类里面包含了属性和方法。

属性

通过在类定义中使用关键字 var 来声明变量,即创建了类的属性,也叫类的成员属性。

语法:

class class_name{
    var $var_name;
}

举个例子说明,如果定义一个 人 的类,那么人的 姓名、年龄、性别 等等便可以看做 人 这个类的属性。

方法

通过在类定义中声明函数,即创建了类的方法。

语法:

class class_name{
    function function_name(arg1,arg2,……)
    {
        函数功能代码
    }
}

类的应用

一个定义了属性和方法的类就是一个完整的类了,可以在一个类里面包含一个完整的处理逻辑。使用 new 关键字来实例化一个对象以便应用类里面的逻辑。可以同时实例化多个对象。

语法:

object = new class_name();

实例化一个对象后,使用 -> 操作符来访问对象的成员属性和方法。

语法:

object->var_name;
object->function_name;

如果要在定义的类里面访问成员的属性或者方法,可以使用伪变量 $ this 。$this 用于表示 当前对象 或 对象本身 。

例子:

<?php
header("content-type:text/html;charset=utf-8");
class Person {
    //人的成员属性
    var $name;    //人的名字
    var $age;    //人的年龄
    //人的成员 say() 方法
    function say() {
        echo "我的名字叫:".$this->name."<br/>";
        echo "我的网址是:".$this->age;
    }
}    //类定义结束
//实例化一个对象
$p1 = new Person();
//给 $p1 对象属性赋值
$p1->name = "网络安全";
$p1->age = 'www.baidu.cn';
//调用对象中的 say()方法
$p1->say();
?>

代码运行结果如下:

我的名字叫:网络安全
我的网址是:www.baidu.cn

七、资源(resource)数据类型

资源数据类型是PHP4引进的。资源是一种特殊的变量类型,保存了到外部资源的一个引用:如打开文件、数据库连接、图形画布区域等。

资源是通过专门的函数来建立和使用的。

资源变量在PHP中的使用

$fp = fopen("test.txt", "rw");
var_dump($fp);
fclose($fp);

打印结果:resource(5) of type (stream)

数字5:表示资源ID为5,具体含义后面介绍。

stream:资源类型名称。

资源ID

内核中将注册的资源变量存储在一个HashTable中,并把资源所在HashTable中的key作为资源ID。

所以,实际上PHP中的资源变量实际存储的是一个整型,通过这个ID找到HashTable中对应的资源。

#define Z_RESVAL(zval)          (zval).value.lval 
#define Z_RESVAL_P(zval)        Z_RESVAL(*zval) 
#define Z_RESVAL_PP(zval)       Z_RESVAL(**zval)

上面的宏,是内核中ZE为资源变量赋值的API,看出确实是对整型变量的赋值。

资源类型名称

为了区分资源类型,需要为我们定义的资源定义类型名称。

#define MY_RES_NAME "my_resource" //资源类型名称,PHP通过var_dump打印资源变量时会看到这个名称 
static int my_resource_descriptor; 
ZEND_MINIT_FUNCTION(jinyong) 
{ 
    my_resource_descriptor = zend_register_list_destructors_ex(NULL, NULL, MY_RES_NAME, module_number);//向内核中注册新的资源类型 
}

ZEND_MINIT_FUNCTION(jinyong)会在PHP作为SAPI(例如,Apache的mod_php5扩展)被加载到内存时,会执行所有扩展的ZEND_MINIT_FUNCTION。

其中jinyong,是当前扩展的名字。例如此时扩展的名字就是jinyong

这里为了方便理解,我们就把它认为是扩展在初始化时,会向内核中注册新的资源类型。

创建资源变量

资源类型已经注册成功,也为资源定义了区分的类型名称。现在可以使用这种资源的变量了。

实现PHP中的fopen函数:

PHP_FUNCTION(my_fopen) 
{ 
    zval *res; 
    char *filename, *mode;
    int filename_strlen, mode_strlen;
    FILE *fp;
    if(zend_parse_parameters(ZEND_NUM_ARGS TSRMLS_CC, "s|s",  &filename, &filename_strlen, &mode, &mode_strlen) == FAILURE){ 
        RETURN_FALSE; 
    } 
    //此处省略了对参数的有效性验证 
    fp = fopen(filename, mode); 
    ZEND_REGISTER_RESOURCE(res, fp, my_resource_descriptor);//向全局变量&EG(regular_list)中注册资源变量,并将对应HashTable的ID赋值给res 
    RETURN_RESOURCE(res);//向PHP返回资源变量
}

这里,定义了PHP中名称为my_fopen的函数。my_fopen(string $file_name, string $mode)

实现PHP中的fclose函数:

PHP_FUNCTION(my_fclose) 
{ 
    zval *res;
    FILE *fp; 
    if(zend_parse_parameters(ZEND_NUM_ARGS TSRMS_CC, "r", &res) == FAILURE){ 
        RETURN_FALSE; 
    } 
    if(Z_TYPE_P(res) == IS_RESOURCE){//判断变量类型是否是资源类型 
        zend_hash_index_del(&EG(regular_list), Z_RESVAL_P(res));//EG就类似于PHP中的$_GLOBALS。在全局资源变量regular_list中删除对应ID的资源 
    }else{ 
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "参数必须是资源类型变量"); 
        RETURN_FALSE; 
    } 
    RETURN_TRUE; 
}

定义了PHP中名称为my_fclose的函数。my_fclose($resource)

PHP中使用自定义扩展中的方法

my_fwrite($fp, "aaTest"); 
var_dump($fp); 
my_fclose($fp); 
var_dump($fp);

可以正常,打开和关闭资源。

释放资源

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

注意: 持久数据库连接比较特殊,它们不会被垃圾回收系统破坏。

八、空值(null)数据类型

空值,跟它的名字一样,表示一个变量没有任何值。空值(null)是不区别大小写的,也就是null与NULL或Null是一样的。

在PHP中被赋予空值的情况有三种:

第一种:

尚未被赋值

<?php
$a;
var_dump($a);
?>

代码运行结果如下:

NULL

第二种:

被赋值为 NULL。

<?php
$nu=null;
var_dump($nu);
?>

代码运行结果如下:

NULL

第三种:

被unset()函数处理过的变量

<?php
$name = 'Felipe';
var_dump((unset) $name);
?>

代码运行结果如下:

NULL

实例

字符串string1被赋值为null,string2根本没有声明和赋值,所以输出null,最后的string3虽然被赋予了初值,但被unset()函数处理后,也变为null型。unset()函数的作用就是从内存中删除变量。代码如下:

<?php
header("content-type:text/html;charset=utf-8");
echo  "变量($string1)直接赋值为null";
$string=null;                                          //$string1被赋空值
$string3="str";                                      //$string3被赋值str
if(is_null($strig1=null)){                    //判断$string1是否为空
    echo 'string=null';
}
echo '<p>';
echo '变量($string2)没有被赋值';
if(is_null($string2=null)){                 //判断$string1是否为空
    echo 'string=null';
}
echo '<p>';
echo '被unset()释放过的变量($string3):';
unset($string3);
if(is_null($string3=null)){//判断$string1是否为空
    echo 'string=null';
}
?>

代码运行结果如下:

变量()直接赋值为nullstring=null
变量($ string2)没有被赋值string=null
被unset()释放过的变量($string3):string=null

is_null函数用来判断变量是否为null,在后面我们会讲到,现在先了解一下,这个函数是返回一个boolean型,如果变量为null,则返回true,否则返回false。unset()函数是用来销毁知道的变量。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值