批改状态:合格
老师批语:
| 转换方式 | 函数 |
|————-|—————|
| 临时转换 | (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' =>579echo '<br>';echo "123 + (int)'456' =>", 123 + (int)'456';//输出:123 + (int)'456' =>579echo '<br>';echo "123 + (int)'PHP456' => ", 123 + (int)'PHP456';//输出:123 + (int)'PHP456' => 123echo '<br>';echo "123 + (int)'456PHP' => ", 123 + (int)'456PHP';//输出:123 + (int)'456PHP' => 579echo '<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>';// 检查 变量是否存在 issetif (!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,objectvar_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.htmlecho 'PATH_INFO : ' . $_SERVER['PATH_INFO'] . '<br>';// 框架中会使用到echo 'URI:' . $_SERVER['REQUEST_URI'];//http://php.io:8080/0126/demo3.php?id=1&name=adminecho '<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的使用。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号