函数内部如何使用函数外部变量
<?php
namespace _0810;
// 问题一、函数内部如何使用函数外部变量
// 作用域
// 1、不支持块作用域
// 2、支持函数作用域
// js
// {
// let a =1;
// }
// clg a 不能访问a
// 1、 不支持块作用域
if( true){
$a =100;
}
// 可以拿到,虽然 a在 代码块中,但是在外边仍然可拿到
echo $a .'<br>';
// 2、支持函数作用域
$name ='小狗';
// 方式一 全局 关键字
function hello():string {
// js函数中可以直接访问自由变量(函数外部声明的遍历)
// 但是在php中不行 。不能直接访问函数外部的全局 变量,但是有5种解决方案
global $name;
return 'hello,' .$name;
}
echo hello().'<hr>';
/**
* 函数内部使用外部变量的5种方式
* 1. global 全局 关键字
* 2. $GLOBALS['outer'] 超全局变量
* 3. function () use ($outer) {...} use 关键字 闭包方式
* 4. fn()=>(...) 箭头函数。php不建议容,功能比较弱
* 5. function ($outer) {...} 参数注入
*/
// 方式二超全局 数组
function hello1():string {
// js函数中可以直接访问自由变量(函数外部声明的遍历)
// 但是在php中不行 。不能直接访问函数外部的全局 变量,但是有5种解决方案
// return 'hello,' .$name;
return 'hello,' .$GLOBALS['name'];
}
// print_r($GLOBALS);
// $GLOBALS['name'] == $name
// 可以拿到name 小狗
// print_r($GLOBALS['name']);
// 可以拿到name hello 小狗
echo hello1().'<hr>';
// 方式三unction () use ($outer) {...} use 关键字 闭包方式 匿名函数
$name ='小猫';
$hello3 =function( ) use ($name):string {
return 'hel' .$name ;
};
echo $hello3().'<hr>';
// 方式四 ,生产环境不用。 箭头函数 () 必须要加关键字 fn 规定 自动注入 多条语句时,不能用箭头函数 箭头后面就是表达式
$name ='小牛';
$hello4 = fn( ) => 'hel' .$name ;
echo $hello4().'<hr>';
// 方式五 纯函数:将函数依赖的外部数据,通过参数注入导函数内部
$name ='小龙';
$hello5 =function($name):string{
return 'hel'.$name;
};
echo $hello5($name).'<hr>';
// 问题二 如果在函数外部,如何访问 函数内部的声明变量
// 方式一
$hello21 =function(){
// 私有变量 有作用域
$username = '小鸭';
return $username;
};
$user = $hello21();
echo $user;
// 方式二
$hello22 =function(){
// 私有变量 有作用域
$username = '小鸭';
// 如果 外部需要 这个私有变量 可以将它所谓返回数据的赠品来返回
// 返回一个数组 【正常返回的数据,私有变量】
return ['hello,',$username];
};
$user = $hello22()[1];
echo $user;
// 方式三 解构方式
$hello23 =function(){
// 私有变量 有作用域
$username = '小社';
// 如果 外部需要 这个私有变量 可以将它所谓返回数据的赠品来返回
// 返回一个数组 【正常返回的数据,私有变量】
return ['hello,',$username];
};
// 将数组成员,解构到独立变量中
list($username ,$result) = $hello23();
// list($username ,$result) = [$hello23()[0],$hello23()[1]]; 相等 解构
echo $username ,$result ;
// 问题3: 如果函数私有变量与外部变量同名怎么办?
$name = '小张';
$hello31 = function () use ($name) : string {
// 私有变量
$name = '小李';
return 'Hello , ' . $name;
};
// 张老师, 还是李老师
// 输出李老师, 因为函数内, 同名私有变量 $name 会覆盖外部同名变量
echo $hello31(). '<hr>';
字符串声明
<?php
// 字符串 两种声明
// 1、单引号
// 2、双引号
/**
* 1. 纯文本
* (1) 定界符: 单引号 / nowdoc
* (2) 特点: 不解析变量, 不转义特殊符号的转义序列
* (3) 场景: 静态文本,不含变量和转义符
*/
// nowdoc 传统的单引号
$domain = 'http://www.baidu.com';
// \n\r 代表回车换行 但是在单引号里面原样显示。变量 $domain 不处理,不生效 不解析变量 适合大段文本
$str = '网站名称 : \n\r $domain ' ;
echo $str;
// 语法糖// nowdoc 传统的单引号 适合写大段多行文本
// 标识符
$str = <<<'TEXT'
<header>
<nav>
<a href="">首页</a>
<a href="">视频</a>
<a href="">文章</a>
</nav>
</header>
TEXT;
echo $str;
/**
* 2. 模板字符串
* (1) 定界符: 双引号 / heredoc
* (2) 特点: 解析变量, 转义特殊符号
* (3) 场景: 包含插值变量和特殊字符的就动态模板
*/
$site = "网站名称:\n\r $domain";
echo $site;
$site = "网站名称:\n\r \"$domain\"";
echo $site;
// 双引号 / heredoc 语法糖
// 适用于大段的多行的动态文本内容,内部有变量和大量的双引号
// html 模板 "
$tp1 = <<< "PHPCN"
<ul style="display: inline-block; border:1px solid ">
<li>百度</li>
<li style="color:brown">http://www.baidu.com</li>
</ul>
PHPCN;
// 注意PHPCN; 顶格写
echo $tp1;
/**
* 备注
* 1. TXT, PHPCN: 只是标识符,全大写只是行业约定, 可任意命名,只要成对出现即可
* 2. nowdoc的标识符,单引号必须写,如 'TXT'
* 3. heredoc: PHPCN双引号是可选的, 例如 PHPCN也可以, 推荐不要写
* 4. 更多转义序列: https://www.php.net/manual/zh/language.types.string.php#language.types.string.syntax.single
*/
常量
<?php
namespace _0810;
use const _0810\EMAIL as _0810EMAIL;
// 1、常量
// 1.1、define()
// 1.2、const()
// 惯例全部大写,s蛇形命名,用下划线连接
// 常量前面不加$符号 约定全部大写,蛇形命名 约定大于规则
define('U_N','admin');
const EMAIL = '123@qq.com';
echo U_N , ',',EMAIL;
/**
* define, const 区别
* 1. define是函数,可用在if中, 不能用在类中 不能预编译
* 2. const: 编译阶段处理, 速度更快, 必须在作用域顶部声明,可用在类中, 不能用在if中
* 3. 常量不受作用域限制 , 全局有效
*/
function hello() : string{
// return print_r(U_N,true);
// return print_r(EMAIL,true);
// return printf('<pre>%s</pre>',print_r(U_N,true));
// return printf('<pre>%s</pre>',print_r(EMAIL,true));
// return sprintf('<pre>%s</pre>',print_r(EMAIL,true));
// return sprintf('<pre>%s</pre>',print_r(EMAIL));
return sprintf(' %s %s',U_N,EMAIL);
}
echo hello();
// constant( ) 显示一个常量
echo U_N;
echo constant('U_N');
// const 声明的常量 不能用 constant 打印
// echo constant('EMAIL');
echo '<hr>';
// 空字符合一当常量名 保存全局数据 如版本号、操作系统等
define( '','php');
// constant( ) 可以空字符
// 空字符声明一个常量, 是否全法?
echo constant('');
// 不报错,完全合法,但你就是看不到
echo '';
// 自定义常量
// 预定义常量、
echo 'php版本'.PHP_VERSION.'<br>';
echo '操作系统'.PHP_OS.'<br>';
// 预定义常量的子集:魔术常量 前后缀有两个下划线
// 它的值 是变化的 是由系统自动赋值与更新,用户不能修稿,只读
echo '当前行号'.__LINE__.'<br>';
echo '当前文件'.__FILE__.'<br>';
echo '当前路径/目录'.__DIR__.'<br>';
// 因为常量可以无视作用域, 可以在所有php脚本中, 横冲直撞, 无冕之王
// 所以,特别适合保存一些全局可能用到,并且需要在所有脚本中保持数据一致的值,例如版本号
// 这种由php系统定义, 程序员无须提前声明,可以直接拿来就用的常量,叫"预定义常量" 或"内置常量"
// (2) 特殊的预定义常量: 魔术常量
// 魔术常量,其实是预定义常量的一个子集
// 为什么叫魔术常量?
// 常量二大特征: 有确定的值, 具不能修改
// 但是魔术常量, 没有确定的值,上系统自动更新维护,用户不能改,所以叫魔术常量
字符串 常量函数
<?php
namespace _0810;
// 字符串 常量函数
// 1、string <-> array
// separator 分隔符
// 1.1 数组转字符串 array-> string implode($separator,$arr):string
$colors = ['red','green','blue'];
echo implode(',',$colors);
// 1.2 字符串转数组 string -> array explode($separator,$string)
$link = 'mysql:dbname=phpedu;root;root';
// 用 ; 分割上面的数据库连接参数
// 注意 explode 里面的 ; 号是字符串 里面的分隔标识
// $db = explode(';',$link);
// print_r($db);
// list($dsn,$user,$password) = explode(';',$link);
// printf('dsn = %s<br>user=%s<br>password=%s<br>',$dsn,$user,$password);
// 简化
$arr = list($dsn,$user,$password) = explode(';',$link);
vprintf('dsn = %s<br>user=%s<br>password=%s<br>',$arr);
echo '<hr>';
// 2、查询 与替换
$str = 'phpbaidu';
// substr($tr,start ,size)子串
// 正向
echo substr($str,0,3).'<br>';
echo substr($str,4,2).'<br>';
echo substr($str,4,0).'<br>';
echo substr($str,4).'<br>';
// 反向 -1 -2 -3 -4
echo substr($str,-2,2).'<br>';
// strstr :首次字符出现的位置之后的字符
// 获取文件扩展名
$img = 'banner.png';
echo strstr($img,'.').'<br>';
// 去掉扩展名 ltrim 左边 rtrim右边
echo ltrim( strstr($img,'.'),'.').'<br>';
// echo rtrim( strstr($img,'.'),'.').'<br>';
// 获取文件名 增加 true
echo strstr($img,'.',true).'<br>';
// 获取位置 首次出现的索引
// strpos 首次出现的索引
// delete from staff where id =1
echo strpos($str,'p').'<br>';
// 第三个 设置起点
echo strpos($str,'p',1).'<br>';
// 字符串替换 str_replace
// \admin\controller\User 类文件路径
$class = '\admin\controller\User';
// 注意要两个\不然会转义
echo str_replace('\\','/',$class) .'<br>';
echo str_replace('a','b',$class) .'<br>';
// 考虑到不同操作系统, 路径分隔符不同,例如windows: "/,\", linux/max: /
// echo str_replace('\\',DIRECTORY_SEPARATOR,$class).'<br>';
// 简化重定义
define('DS',DIRECTORY_SEPARATOR);
echo str_replace('\\',DS,$class) .'<br>';
$bad = ['交友','异性'];
$goos = ['你好','吃饭'];
$str = '我要某个交友软件,找了异性朋友';
// $bad 和 $goos 一 一对应
echo str_replace($bad,$goos,$str) .'<br>';
$bad = ['交友','异性'];
$goos = '***';
$str = '我要某个交友软件,找了异性朋友';
// $bad 和 $goos 一 一对应
echo str_replace($bad,$goos,$str) .'<br>';
// 3、删除指定字符
$str = ' baidu.com ';
echo strlen($str) .'<br>';
// 空格过滤
echo strlen(trim($str)) .'<br>';
// 去掉指定字符
// 从右边去
$str = 'php.cn';
echo rtrim($str,'.cn').'<br>';
echo ltrim($str,'php.').'<br>';
// 过滤html 标签
echo strip_tags('<h1>php</h1>').'<br>';
// 过滤 php 代码 过滤js 防止脚本注入
echo strip_tags('<h1>php</h1><?php ecoh \'hello\' ?>').'<br>';
// trim(string $string, string $characters = " \t\n\r\0\x0B"): string
// 相关: ltrim(), rtrim(),仅删除左边或右边字符
// strip_tags(string $string, string[]|string|null $allowed_tags = null): strings
// 4、url相关
$url = 'http://bittel.com/zuoye.php?a=1&b=2&c=3';
// ?a=1&b=2&c=3 查询字符串 ,get请求 向服务器发送查询参数
// "?"后面称为"查询字符串",用于GET请求是发送到后端的参数
// 使用系统常量可获取到url中的查询字符串
// print_r($_SERVER);
// QUERY_STRING 获取查询字符串
echo $_SERVER['QUERY_STRING'] . '<br>';
// 查询字符串 保存到数组内
parse_str( $_SERVER['QUERY_STRING'] ,$arr );
printf('<pre>%s</pre>',print_r($arr,true));
// parse_url()
$arr = parse_url($url);
printf('<pre>%s</pre>', print_r($arr,true) );
echo parse_url($url)['query'];
// 反函数 : 将数组转为查询字符串
echo http_build_query(['a' => 1, 'b' => 2, 'c' => 3]) . '<br>';