Php入门教程之PHP 数据类型用法详解

PHP 数据类型
PHP 支持八种原始类型(type)。

四种标量类型:

1.string(字符串)
2.integer(整型)
3.float(浮点型,也作 double )
4.boolean(布尔型)
两种复合类型:

1.array(数组)
2.object(对象)
两种特殊类型:

1.resource(资源)
2.NULL(空)
查看变量类型
通过 gettype() 函数可以方便的查看某个变量的类型:

<?php
$bool = TRUE;     // 布尔型
$str  = "foo";     // 字符串
$int  = 12;        // 整型

echo gettype($bool);        // 输出 boolean
echo gettype($str);     // 输出 string
echo gettype($int);     // 输出 integer
?>

判断变量类型

如果想通过判断变量类型来可以使用 is_type 函数:

<?php
$var_int  = 12;

// 如果 $var_int 是 int 类型,这进行加法
if (is_int($var_int)) {
    $var_int = $var_int+4;
}
echo $var_int;  // 输出 16
?>

以上基本就是PHP数据类型的基本内容,大家如果想了解具体每个数据类型的用法,可以查阅PHP手册,里面有详细的说明。

数据类型转换

PHP数据类型有三种转换方式:

•在要转换的变量之前加上用括号括起来的目标类型
•使用3个具体类型的转换函数,intval()、floatval()、strval()
•使用通用类型转换函数settype(mixed var,string type)
 第一种转换方式: (int)  (bool)  (float)  (string)  (array) (object)
 
•<?php  
•$num1=3.14;   
•$num2=(int)$num1;   
•var_dump($num1); //输出float(3.14)   
•var_dump($num2); //输出int(3)   
•?> 

第二种转换方式:  intval()  floatval()  strval()

 
•<?php  
•$str="123.9abc";   
•$int=intval($str);     //转换后数值:123   
•$float=floatval($str); //转换后数值:123.9   
•$str=strval($float);   //转换后字符串:"123.9"    
•?> 

第三种转换方式:  settype();

 
•<?php  
•$num4=12.8;   
•$flg=settype($num4,"int");   
•var_dump($flg);  //输出bool(true)   
•var_dump($num4); //输出int(12)   
•?>

PHP数据类型隐性转换的陷阱

我这里说的是php5+上跑的,php4的请飘过。

先把错误报告打开,以防看不到错误信息
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
?>

根据php manual 中 http://www.php.net/manual/zh/language.operators.comparison.php
“Comparison Operators” 一章的说明可知,number 和string进行比较的时候,会先将string类
型首先转化为number,然后再进行比较操作。

1.类型自动转换为数组
当我们把一个非数组的变量当做数组来调用的时候,该变量在调用时数据类型临时自动转换成数组。
例如如下代码:
<?php
$str = 'string';
var_dump($str['aaa']);  // string(1) "s"
var_dump($str);  // string(6) "string"

if($str['aaa'] === $str[0]) {
    print "===";
}
?>

如下例子可以明显的看出下标类型自动转换在发生。
<?php 
$link = '<a href="http://yulans.cn">yulans</a>'; 
$key = '1-10'; 
echo "$link[$key]n";  // 同 $link[1]
echo "{$link[$key]}n";  // 同 $link[1]
//echo "$link['$key']n";  // 报错
echo "{$link['$key']}n";  // 同 $link[0]
?> 

这里字符串在 var_dump($str['aaa']) 被临时转换成了数组 array('s','t','r','i', 'n','g'),而用关联数组方式
$str['aaa']读取索引数组的值,关联数组的下标'aaa'将被转换成整形下标,
因而在这里的$str['aaa']全等于$str[0]。

其他数据类型隐性转换成数组也隐藏有陷阱,一般都不是报出undefined index错误。举例如下代码:
<?php
/**
 * 测试变量隐性转换成数组
 *
 * @param mixed $param
 */
function test2Arr($param) {
    var_dump($param['abc']);
}

test2Arr(false); // NULL
test2Arr(123); // NULL
test2Arr(123.456); // NULL
test2Arr('string'); // string(1) "s"
test2Arr(array('abc'=>'text'));  // string(4) text
test2Arr(new ArrayObject()); // Notice: undefined index: abc

?>

解决办法:
函数参数数据类型是数组的时候,防止用户输入字符串导致错误
如下例子,当添加用户的时候,我们要求用户必须输入用户名。没有哪个SB把要求是数组的参数传入
字符串,但是防人之心不可无,说不定我连续工作超过十几个小时后一不小心就成那个SB了,又或许
某人想绕过代码执行操作。
<?php
/**
 * 添加用户(错误的写法)
 *
 * @param array $user
 */
function addUser($user) {
    if(empty($user['name'])) {  // 这里当输入类型是不为空的字符串的时候会出错,
        echo "用户名必填n";
        return false;
    }

    // do sth.

    echo "测试n";

    return true;
}

/**
 * 添加用户(正确的写法)
 *
 * @param array $user
 */
function addUser2($user) {
    if(!is_array($user) || empty($user['name'])) {
        echo "用户名必填n";
        return false;
    }

    // do sth.

    echo "测试n";

    return true;
}

$user = 'xiaoxiao';
addUser($user);
addUser2($user);

?>

2.纯数字字符串比较时自动转换成整形超过范围时发生溢出
<?php
$x1 = '111111111111111111';
$x2 = '111111111111111112';

echo ($x1 === $x2) ? "true" : "false";  // false 如我们所愿,这两个字符串确实不一样。
echo ($x1 == $x2) ? "true" : "false";    // true 这里被偷偷的转换类型了,
                                                           // 成了 echo (intval($x1) == intval($x2)) ? "true" : "false"; 整形溢出

?>

3、整形和字符串比较时数据类型隐性转换有可能发生问题
<?php
$number = 0;
$string = 'text';

if($number == $string) {
    print "true";
} else {
    print "false";
}

?>

很遗憾这里输出的是 true
我们知道 $number === $string 肯定是false,手册上说 === 是比较值&&数据类型,而用 == 只是比较值,
$number == $string 这里不是比较值吗? '0' 和 'text' 明显不一样啊。小心了,这里的$string是
先被秘密转成和$number一样的整形再比较的,$number == (int)$string的确是true

4. in_array 小陷阱
<?php

var_dump(in_array(0, array('s')));  // true

?>
因为in_array会将0 和's' 进行比较,0是number类型,'s'是string类型, 's'转化为number的结果为0,
而0 == 0 的结果是true,所以in_array(0, array('s', 'ss'))的结果也是true

如果把in_array 的第三个参数strict设置为 true,比较的时候 就会判断值和类型是否都相当。
如果都相当的话,才会返回true,否则返回false.

时间: 2024-07-31 09:14:03

Php入门教程之PHP 数据类型用法详解的相关文章

Zend Framework入门教程之Zend_Config组件用法详解_php实例

本文实例讲述了Zend Framework中Zend_Config组件用法.分享给大家供大家参考,具体如下: 1.从PHP数组中读取数据 使用Zend_Config_Ini(读取ini配置文件) Zend_Config_Xml(读取XML配置文件) 案例: <?php require_once("Zend/Loader.php"); Zend_Loader::loadClass('Zend_Config'); $array = array( 'webhost' => '12

Zend Framework入门教程之Zend_Registry组件用法详解_php实例

本文实例讲述了Zend Framework中Zend_Registry组件用法.分享给大家供大家参考,具体如下: 1.对象注册表 入门案例: <?php require_once("Zend/Loader.php"); Zend_Loader::loadClass('Zend_Registry'); $member = array( "姓名"=>"张三", "性别"=>"女", "

Zend Framework入门教程之Zend_Registry组件用法详解

本文实例讲述了Zend Framework中Zend_Registry组件用法.分享给大家供大家参考,具体如下: 1.对象注册表 入门案例: <?php require_once("Zend/Loader.php"); Zend_Loader::loadClass('Zend_Registry'); $member = array( "姓名"=>"张三", "性别"=>"女", "

Zend Framework入门教程之Zend_Config组件用法详解

本文实例讲述了Zend Framework中Zend_Config组件用法.分享给大家供大家参考,具体如下: 1.从PHP数组中读取数据 使用Zend_Config_Ini(读取ini配置文件) Zend_Config_Xml(读取XML配置文件) 案例: <?php require_once("Zend/Loader.php"); Zend_Loader::loadClass('Zend_Config'); $array = array( 'webhost' => '12

Zend Framework教程之Zend_Controller_Plugin插件用法详解_php实例

本文实例讲述了Zend Framework教程之Zend_Controller_Plugin插件用法.分享给大家供大家参考,具体如下: 通过Zend_Controller_Plugin可以向前端控制器增加附加的功能.便于w一些特殊功能.以下是Zend_Controller_Plugin的简单介绍. Zend_Controller_Plugin的基本实现 ├── Plugin │   ├── Abstract.php │   ├── ActionStack.php │   ├── Broker.p

Zend Framework入门教程之Zend_Session会话操作详解

本文实例讲述了Zend Framework入门教程之Zend_Session会话操作.分享给大家供大家参考,具体如下: 会话命名空间 实现会话 代码: <?php require_once "Zend/Session/Namespace.php"; $myNamespace = new Zend_Session_Namespace('Myspace'); if(isset($myNamespace->numberOfPageRequests)) { $myNamespace

AngularJS入门教程之Select(选择框)详解_AngularJS

AngularJS Select(选择框) AngularJS 可以使用数组或对象创建一个下拉列表选项. 使用 ng-options 创建选择框 在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,如下实例: 实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="http://a

java入门教程之Struts初配置详解

1.下载struts的jar包 2.将struts的jar包放到WEB-INF/lib目录下 3.配置struts-config.xml  代码如下 复制代码 <form-beans> <form-bean name="loginForm(自己命名)" type="com.struts.LoginActionForm(ActionForm所在包及路径)"/> </form-beans> <action-mappings>

Zend Framework入门教程之Zend_Db数据库操作详解

本文实例讲述了Zend Framework中Zend_Db数据库操作方法.分享给大家供大家参考,具体如下: 引言:Zend操作数据库通过Zend_Db_Adapter 它可以连接多种数据库,可以是DB2数据库.MySQli数据库.Oracle数据库.等等. 只需要配置相应的参数就可以了. 下面通过案例来展示一下其连接数据库的过程. 连接mysql数据库 代码: <?php require_once 'Zend/Db.php'; $params = array('host'=>'127.0.0.