Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:
| 转换方式 | 函数 |
|————-|—————|
| 临时转换 | (int),(string),(array),(object)…|
| 自动转换 | 根据操作符对操作数的类型要求进行 |
| 强制转换 | setType() |
// 类型转换
// 1. 临时转换:用户
// url中的queryString
// http://php.io/0126/demo1.php?查询字符串
// http://php.io/0126/demo1.php?p=5&id=3
// print_r($_GET['id']);
$id = $_GET['id'];
var_dump($id);
//id应该是整数才方便运算
// url中的内容默认是字符串
$id = (int)$id;
if ($id === 3) {
echo '找到数据了';
}
echo '<br>';
$n = 123;
var_dump($n, (string)$n, (float)$n);
echo '<br>';
var_dump((array)$n, ((array)$n)[0]);
$str = 'php';
//字符串转数组意义不大
//字符串本身就可以当数组使用
echo '<br>';
echo $str[0], $str[1], $str[2];
//php 7.4 以后的版本才有效
//echo $str{0}, $str{1}, $str{2};
echo '<br>';
var_dump((object)$str, ((object)$str)->scalar);
echo '<br>';
var_dump($str);
// 2. 自动转换: 系统
//每一种操作符,要求的操作数类型是固定的,如果不满足就自动转换
echo '<hr>';
echo "123 + '456' =>", 123 + '456';
//输出:123 + '456' =>579
echo '<br>';
echo "123 + (int)'456' =>", 123 + (int)'456';
//输出:123 + (int)'456' =>579
echo '<br>';
echo "123 + (int)'PHP456' => ", 123 + (int)'PHP456';
//输出:123 + (int)'PHP456' => 123
echo '<br>';
echo "123 + (int)'456PHP' => ", 123 + (int)'456PHP';
//输出:123 + (int)'456PHP' => 579
echo '<br>';
// "." ,希望两边都是字符串,如果不是就转换为字符串
echo 'php' . 123 . '<br>';
//等价于
echo 'php' . (string)123 . '<br>';
//最常用的是布尔类型转换
// if ($email) echo '没有定义邮箱';
//$email 未定义,null
// var_dump($email);
echo var_export((bool)null);
echo '<br>';
// 检查 变量是否存在 isset
if (!isset($email)) echo '没有定义邮箱';
// 3. 永久转换:只针对变量
echo '<br>';
$price = 888;
echo gettype($price), '<br>';
echo gettype((string)$price), '<br>';
echo gettype($price), '<br>';
//永久转换
settype($price, 'string');
echo gettype($price), '<br>';
转换方式 | 函数 |
---|---|
标量 | is_int(),is_string(),is_bool()…. |
复合 | is_array(),is_object() |
特殊 | is_null(),is_resource() |
<?php
//类型检测
function sum1($a, $b)
{
printf('%d + %d = %d', $a, $b, ($a + $b));
}
echo sum1(10, 15), '<br>';
// echo sum1('php', 'cn');
function sum2($a, $b)
{
// is_numeric():检查参数是否是数值或者数值类型的字符串
// eg: 123,'123'
if (is_numeric($a) && is_numeric($b))
printf('%d + %d = %d', $a, $b, ($a + $b));
// printf('%f + %f = %f<br>', $a, $b, ($a + $b));
else echo '参数类型不匹配';
}
echo sum2('php', 15), '<br>';
echo sum2(15, "123"), '<br>';
//%d 限定了数据的输出
// echo sum2(15.123, "123"), '<br>';
// echo sum2(123.45,123.45);
function sum3($a, $b)
{
if (is_int($a) && is_int($b))
printf('%d + %d = %d', $a, $b, ($a + $b));
else echo '参数类型不匹配 <br>';
}
// sum3(123, '456');
sum3(123, 456);
// sum3(123.45, 456.78);
// php7+:参数类型检测,支持符合类型,也支持标量
echo '<br><hr>';
function sum4(float $a, float $b): string
{
//参数类型限定可以自动识别数值或者数值型字符串,is_numeric()的实现
// return sprintf('%d + %d = %d', $a, $b, ($a + $b));
return $a . '+' . $b . '=' . ($a + $b);
}
echo sum4(120, "456");
echo '<br>';
echo sum4(123.45, 456.78);
echo '<br><hr>';
// is_string(),is_bool(),is_array(),is_object()
// is_null(),is_resource()
// is_scalar():检测是否是标量
// 标量:理解为“单值”,100 ,‘php’,true
// 不是标量:array,object
var_export(is_scalar(1));
echo '<br><hr>';
var_export(is_scalar(true));
echo '<br><hr>';
var_export(is_scalar([true, 1, 2, 'abc']));
echo '<br><hr>';
var_export(is_scalar(new class
{
}));
echo '<br> null 不是标量<br>';
var_export(is_scalar(null));
echo '<br>';
// 函数/闭包/回调 也不是标量
var_export(is_scalar(function () {
}));
//变量知多少
// 需要重复使用的数据,或者代码复用的部分,可以暂存,就需要变量
// 一句话:变量就是代码中需要暂存的数据
// 变量按名访问
// 变量名必须是一个合法标识符
// 合法标识符
// 禁止使用数字开头
// 标识符有两类
// 预定义的:保留字,关键字,class,public
// 自定义
// 1. 变量声明
// 变量除了要满足以上的要求外,还有特殊性
// 1. 变量必须要用"$"为前缀:$name
// 2. 严格区分大小写
$userName = 'TJ';
$username = 'T.,J';
echo $userName, $username;
// 合法:$name ,$_age, $num1
// 非法:name,$123abc,$my-emial,$a#com
// 有些看着合法,不要使用
echo '<br>';
$_ = 1;
$a1 = 2;
$_1 = 3;
var_dump($_, $a1, $_1);
// 1. 驼峰式:$itemPrice,变量,对象的属性和方法,getUser()
// 2. 蛇形: set_publick(),函数
// 3. pascal:UserModel,类,与驼峰式很像,所以也叫大驼峰
// 4. 全大写:常量
// 函数不区分大小写
function hello($name)
{
return 'Hello ' . $name;
}
echo '<br>';
echo hello('php'), '<br>';
echo HELLO('world'), '<br>';
// 2. 变量赋值
echo '<hr>';
$color = 'red';
echo gettype($color), '<br>';
//变量名 用另外一个变量表示
$url = 'site';
// $site = 'php';
$$url = 'php 中文网';
// $$url:可变变量,变量标识符来自另外一个变量
echo $url . ' => ' . $$url . '<br>';
echo $url . ' => ' . $site . '<br>';
// 路由解析 很有用
// 赋值 默认是 “值传递”
$price1 = 888;
$price2 = $price1;
printf('price1 = %d,price2 = %d<br>', $price1, $price2);
$price1 = 666;
printf('price1 = %d,price2 = %d<br>', $price1, $price2);
echo '<hr>';
// 引用赋值 其实就是给原始变量起了一个别名,并未创建新变量
$price1 = 999;
$price2 = &$price1;
printf('price1 = %d,price2 = %d<br>', $price1, $price2);
$price1 = 666;
printf('price1 = %d,price2 = %d<br>', $price1, $price2);
// 3. 预定义变量
// 超全局变量:数组,任何地方都可以访问,不受作用域限制
// $GLOBALS:引用全局作用域中可用的全局变量
// $_SERVER:服务器和执行环境信息
// $_GET:通过URL参数(又叫query string) 传递给当前脚本的变量的数组
// $_POST:当HTTP POST请求的 Content-Type 是 application/x-www-
// $_FILES:通过HTTP POST方式上传到当前脚本的项目的数组
// $_COOKIE:通过当前脚本可用 SESSION 变量的数组
// $_REQUEST:默认情况下包含了 $_GET,$_POST 和$_COOKIE 的数组
// $_NEV:通过环境方式传递给当前脚本的变量的数组
// $GLOBALS
$name = 'TJ';
$email = 'TJ@php.cn';
printf('name = %s,email = %s<br>', $name, $email);
printf('name = %s,email = %s<br>', $GLOBALS['name'], $GLOBALS['email']);
// $_SERVER
//array_walk()
// array_walk($_SERVER, function ($value, $key, $separator) {
// echo $key . $separator . $value . '<br>';
// }, '=>');
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://php.io:8080/0126/demo3.php?id=1&name=admin
//id=1&name=admin 查询字符串,给GET请求用
echo '查询字符串 :' . $_SERVER['QUERY_STRING'] . '<br>';
//http://php.io:8080/0126/demo3.php?id=1&name=admin
//http://php.io:8080/0126/demo3.php/id/5/name/peter
// /id/5/name/peter :path_info
//隐藏入口文件
//http://php.io:8080/0126/id/5/name/peter.html
echo 'PATH_INFO : ' . $_SERVER['PATH_INFO'] . '<br>';
// 框架中会使用到
echo 'URI:' . $_SERVER['REQUEST_URI'];
//http://php.io:8080/0126/demo3.php?id=1&name=admin
echo '<br>';
echo $_GET['id'];
// 常量
// 常量是固定值,一旦创建不可更新,不可删除
// 常量不是变量,前面不要加 “$”符
// 常量推荐全部大写,多个单词之前用"_"链接
// 1. 函数
define('NATION', '中国');
// 2. 关键字
const GENDER = '男';
printf('国籍: %s, 性别:%s <br>', NATION, GENDER);
// 程序执行有两个阶段:编译, 运行
// 编译阶段:对代码进行静态分析,主要针对现在能看到的,或者能够确定下来的值。
// 常量,类声明
// const 运行在编译阶段。
// define() 在运行阶段才创建常量
// if(),function()
function a()
{
define('SITE', 'php.cn');
}
a();
echo SITE, '<br>';
if (true) {
define('NAME', 'TJ');
}
echo NAME, '<br>';;
// const 只支持字面量,不允许表达式
define('B', '我是' . NAME);
echo B, '<br>';
define('ARR1', [1, 2, 3]);
print_r(ARR1);
const ARR2 = ['a', 'b', 'c'];
print_r(ARR2);
注意:isset(),$GLOBALS,$_SERVER的使用。