1. 数据类型的转换与检测技术;
数据类型的转换
<?php
// 类型转换
// 1. 临时转换: 用户
// http://by.io/012601/demo1.php?id=3
$id = $_GET['id'];
var_dump($id);
echo '<br>';
// id应该是整数才方便运算
// url中的内容全部默认是字符串
$id = (int)$id;
if($id===3){
echo '数据存在';
};
echo '<br>';
$n = 123;
var_dump($n,(string)$n,(float)$n);
echo '<hr>';
var_dump((array)$n,((array)$n)[0]);
$srt = 'php';
//字符串转数组的意义不大
echo $str[0],$str[1],$str[2],'<br>';
var_dump((object)$str,((object)$str)->scalar);
var_dump($str);
echo '<br>';
// 2. 自动转换: 系统
//每一种操作符,它要求的操作数类型是固定的,如果不满足就自动转换
echo 222 + "333";
echo '<br>';
//"+"要求参与计算的数据都是数值类型,如果不是,就是会触发自动转换
echo 222+ (int)'111';
echo '<br>';
echo 123 + 'php111';
echo '<br>';
echo (int)'php111';
echo '<br>';
echo 123 + (int)'php111';
echo '<br>';
//".",希望两边都是字符串,如果不是就转换
echo 'php' . 123 . '<br>';
//等价于
echo 'php' . (string)123 . '<br>';
// 最常用的是布尔转换
if (!$email) echo '没定义邮箱';
var_dump($email);
echo var_export((bool)null);
echo '<hr>';
if (!isset($email)) echo '没定义邮箱';
// 3. 永久转换: 只针对变量
$price = 111;
echo gettype($price),'<br>';
echo gettype((string)$price),'<br>';
echo gettype($price),'<br>';
//永久转换
settype($price,'string');
echo gettype($price),'<br>';
类型检测
<?php
//类型检测
function sum1($a, $b)
{
printf('%d + %d = %d<br>', $a, $b, ($a + $b));
}
sum1(11, 22);
// sum1('php','cn');
function sum2($a, $b)
{
// is_numeric():检查参数是否是数值或数值型的字符串
// 123, "123"都是有效的数据
if (is_numeric($a) && is_numeric($b))
printf('%d + %d = %d<br>', $a, $b, ($a + $b));
else echo '参数类型错误';
}
sum2(22,33);
sum2('php','cn');
echo '<br>';
sum2(1,'111');
function sum3 ($a,$b)
{
if (is_int($a) && is_int($b))
printf('%d + %d = %d<br>', $a, $b, ($a + $b));
else echo '参数类型错误';
}
sum3(11,'22');
echo '<br>';
sum3(11,22);
sum3(11.1,22.2);
echo '<hr>';
// php7+: 参数类型检测,支持复合类型,也支持标量
function sum4(float $a,float $b) : string
{
// 参数类型限定可以自动识别数值或数值型的字符串, is_numeric()
// return sprintf('%d + %d = %d<br>', $a, $b, ($a + $b));
return $a . ' + ' . $b . ' = ' . ($a + $b). '<br>';
}
echo sum4(11, "22");
echo sum4(11.11, 22.22);
echo '<hr>';
// is_scalar(): 检测变量类型是否是标量
var_export(is_scalar(1));
echo '<br>';
var_export(is_scalar(new class{}));
echo '<br>';
var_export(is_scalar([]));
echo '<br>';
// null 不是标量
var_export(is_scalar(null));
// 函数/闭包/回调
echo '<br>';
var_export(is_scalar(function(){}));
2. 变量声明与常量声明的方式与使用
变量声明
<?php
// 1. 变量声明
// 变量必须要用"$"为前缀: $name
// 严格区分大小写
$userName = '小明';
$password = 123;
echo '账户名:'.$userName, ',','密码:'.$password,'<br>';
$_ = 1;
$a1 = 2;
$_1 = 3;
var_dump($_, $a1, $_1);
echo '<hr>';
// 1. 驼峰式: $itemPrice,变量,对象的属性和方法, getUser()
// 2. 蛇形: set_public(),函数
// 3. 帕斯卡: UserModel, 类,与驼峰式很像,所以也叫: 大驼峰
// 4. 全大写: 常量
// 函数不区分大小写
function hello($name)
{
return 'Hello ' . $name;
}
echo hello('小明'),'<br>';
echo HELLO('小红'),'<br>';
// 2. 变量赋值
$color = 'red';
echo gettype($color),'<br>';
$url = 'site';
$$url = 'php中文网';
// $$url: 可变变量,变量标识符来自另外一个变量
echo $url . ' => ' . $$url . '<br>';
echo $url . ' => ' . $site . '<br>';
// 默认是"值传递"
$price1 = 111;
$price2 = $price1;
printf('price1 = %d, price2 = %d<br>', $price1, $price2);
$price1 = 222;
printf('price1 = %d, price2 = %d<br>', $price1, $price2);
echo '<hr>';
// 引用赋值
$price1 = 333;
// $price2 =& $price1;
$price2 = &$price1;
// 引用赋值其实就是给原始变量起一个别名,并未创建新变量
printf('price1 = %d, price2 = %d<br>', $price1, $price2);
$price1 = 444;
printf('price1 = %d, price2 = %d<br>', $price1, $price2);
// 3. 预定义变量
// 超全局变量: 数组,任何地方都可以访问,不受作用域限制
// $GLOBALS: 引用全局作用域中可用的全部变量
// $_SERVER: 服务器和执行环境信息
// $_GET :通过 URL 参数(又叫 query string)传递给当前脚本的变量的数组
// $_POST:当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时,会将变量以关联数组形式传入当前脚本
// $_FILES:通过 HTTP POST 方式上传到当前脚本的项目的数组
// $_COOKIE:通过 HTTP Cookies 方式传递给当前脚本的变量的数组
// $_SESSION:当前脚本可用 SESSION 变量的数组
// $_REQUEST: 默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组
// $_ENV: 通过环境方式传递给当前脚本的变量的数组
// $GLOBALS
$name = '小明';
$email = 'xm@php.cn';
printf('name = %s, email = %s<br>', $name, $email);
printf('name = %s, email = %s<br>', $GLOBALS['name'], $GLOBALS['email']);
echo 'IP: '. $_SERVER['REMOTE_ADDR']. '<br>';
echo '浏览器: '. $_SERVER['HTTP_USER_AGENT']. '<br>';
echo '脚本绝对路径 = '. $_SERVER['SCRIPT_FILENAME']. '<br>';
echo '脚本相对路径 = '. $_SERVER['SCRIPT_NAME']. '<br>';
echo '当前脚本名称 = '. $_SERVER['PHP_SELF']. '<br>';
// http://by.io/012601/demo3.php?id=1&name=admin
// id=1&name=admin 查询字符串,给GET请求用
echo '查询字符串 : '. $_SERVER['QUERY_STRING']. '<br>';
// http://by.io/012601/demo3.php?id=1&name=admin
// http://by.io/012601/demo3.php?id=1&name=admin
// /id/5/name/xm: path_info
echo 'PATH_INFO = '. $_SERVER['PATH_INFO']. '<br>';
echo 'URI: ' . $_SERVER['REQUEST_URI'], '<br>';
echo $_GET['id'];
常量声明
<?php
// 常量
// 是固定的值,一旦创建不可更新,不可删除
// 常量不是变量,前面不要加" $ "
// 常量推荐全部大写,多个单词之间用下划线连接
// 1.函数
define('NAME', '小明');
// 2. 关键字
const SEX = '男';
printf('姓名: %s, 性别: %s<br>', NAME, SEX);
function a() {
define('ID', 123);
// const A = 1;
}
a();
echo ID;
if (true) {
define('NAME', '小明');
}
echo NAME;
echo '<br>';
// const 只支持字面量,不允许表达式
define('B', '我是' . NAME);
echo B, '<br>';
define('ARR1', [1,2,3]);
print_r(ARR1);
const ARR2 = [1,2,3];
print_r(ARR2);