php数据类型转换及变量与常量的差别

一.类型转换

1.1:自动转换

PHP属于弱类型语言,和java,C++等语言强类型语言的区别在于:弱类型的语言是自动转换数
据类型,例如数字字符串和数字相加,数字字符串会自动转为数字类型:

  1. //写一个两数相加的函数方便后面演示:
  2. function add($a,$b){
  3. return var_dump($a+$b);
  4. };

例1:数字字符串和数字相加,数字字符串会转为int类型:

  1. echo add("12",16);//运算结果是int(28)

例2:布尔值的true会自动转成:1,false会转成0,null也是0

  1. echo add(true,1);//int(2)
  2. echo add(false,1);//int(1)
  3. echo add(null,1);//int(1)

例3:如果里面有数字和非数字字符串混合的数字字符串,会把非数字字符串丢掉,如果数字是小数,会自动转为浮点数,但是里面的非数字字符串不能在前

  1. echo add("12.1212abcd",10);//float(22.1212)
  2. echo add("abc12",1);//会报错

1.2:临时转换

使用括号加目标类型进行转换
例如:

  1. $num1 = "123";
  2. var_dump($num1);//string(3) "123"
  3. var_dump((int)$num1);// int(123)

但是不会改变原来的值:

  1. var_dump($num1);//string(3) "123"

进行布尔判断时,如果是空值,可以把空值转为bool类型:

  1. var_dump((bool)null);//bool(false)

1.3:永久转换: 只针对变量

settype():第一个参数 你要改变类型的变量,第二个参数 你要改变的类型名
例如:

  1. $price = 123;
  2. echo gettype($price);//integer
  3. settype($price,'string');
  4. echo gettype($price);//string

二.类型检测

1:is_numeric():检查参数是否是数值或数值型的字符串,例如:“10”和10,都是有效的数据,如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE。
写一个检测函数来示例:

  1. function examin($a){
  2. if(!is_numeric($a)){
  3. return $a."不是数字类型";
  4. }else{
  5. return $a."是数字类型";
  6. }
  7. };
  1. echo examin(123);//123是数字类型
  2. echo examin("123");//123是数字类型
  3. echo examin("123abc");//123abc不是数字类型
  4. echo examin("abc123");//abc123不是数字类型

类似的检测方法还有:
is_string():是不是字符串
is_resource():是不是资源
is_array():是不是数组
is_bool():是不是布尔值
is_file():是不是文件
is_dir():检查指定的文件是否是一个目录

……

#### 2.is_scalar(): 检测变量类型是否是标量
标量理解为:是不是单值,例如:123,”php”,false
不是标量:[12,31,21],new class{}
例如:

  1. var_export(is_scalar(new class{}));//false
  2. var_export(is_scalar(1));//true

三.变量与常量

1.变量:

变量就是代码中需要暂存的数据,变量名仅允许英文字母,数字,下划线,并禁止数字开头,不能使用保留字和预定义的,必须以$为前缀,并严格区分大小写
1.2:可变变量:
在变量前面加上两个name,这表示可变变量,可以动态的设置和使用,先设置一个普通变量,一个可变变量会获取了一个普通变量的值作为这个可变变量的变量名,说起来很绕,可以用代码玩一下:

  1. $a = 'c';
  2. $c = 'a';
  3. echo $a;//c
  4. echo $$a;//a

**2.变量的赋值:
2.1默认是值传递:

  1. $num1=100;
  2. $num2=$num1;
  3. echo $num2;//100
  4. $num1 = 99;
  5. echo $num2;//100

2.2:引用赋值:引用赋值其实就是给原始变量起一个别名,并未创建新变量,方法是在变量前加一个”&”

  1. $num1=100;
  2. $num2=&$num1;
  3. echo $num2;//100
  4. $num1 = 99;
  5. echo $num2;//99

2.预定义变量:

在官方的文档中,预定义变量有下面这些:
超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量
$GLOBALS — 引用全局作用域中可用的全部变量
$_SERVER — 服务器和执行环境信息
$_GET — HTTP GET 变量
$_POST — HTTP POST 变量
$_FILES — HTTP 文件上传变量
$_REQUEST — HTTP Request 变量
$_SESSION — Session 变量
$_ENV — 环境变量
$_COOKIE — HTTP Cookies
$php_errormsg — 前一个错误信息
$http_response_header — HTTP 响应头
$argc — 传递给脚本的参数数目
$argv — 传递给脚本的参数数组

这里我们只拿一小部分来举例:

通过$GLOGALS访问任何变量:

  1. //$GLOBALS:
  2. $name = "法外狂徒张三";
  3. echo $GLOBALS['name'];//法外狂徒张三

获取ip地址:

  1. $_SERVER["REMOTE_ADDR"];

URL:

  1. $_SERVER["REQUEST_URI"];

路径信息:

  1. $_SERVER["PATH_INFO"];

请求开始时的时间戳:

  1. $_SERVER["REQUEST_TIME"];

当前脚本名称:

  1. $_SERVER["PHP_SELF"];

3.常量

常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变。常量默认为大小写敏感。传统上常量标识符总是大写的。
常量名和其它任何 PHP 标签遵循同样的命名规则。合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。

常量有两种声明方法:define(),const.他们之间的差别是:const运行在编译阶段,define()运行阶段才创建常量
注意:在if()和function(){}里面只能用defined()创建常量,const只支持字面量,不允许表达式,define()允许表达式,但是它们都是支持数组的

  1. define('PROVINCE',"Sichuan");
  2. const GENDER = "male";
  3. define('ARR1',[1,2,3]);
  4. echo ARR1[0];//1
  5. echo "<br>";
  6. echo GENDER;//male
  7. if(true){
  8. define("NAME","Jasper");
  9. };
  10. echo NAME;//Jasper