作用域
1.在PHP中,不支持块作用域
2.但是支持函数作用域
3.在JS中,函数内部可以访问全局变量,但是在PHP中,不能访问
$name ='老李';
function getName():string
{
return 'hallo'. $name;
};
//这样会报错,因为在函数内部无法访问外部name变量
有五种方式可以让函数内部可以使用外部变量方式
1.global
$name ='老李';
function getName():string
{
global $name;
};
2.$GLOBALS[‘变量名’]
$name ='老李';
function getName():string
{
return $GLOBALS['name'];
};
echo getName();
3.通过闭包的方式(在PHP中,匿名函数就是闭包)
语法:function () use ($变量名):string {}
$fangfa = function () use ($name):string {
return $name;
};
echo $fangfa();
4.箭头函数
注意:与JS相比,在PHP的箭头函数中,参数列表前必须有fn
语法$fangfa2 = fn() => $name;
$fangfa2 = fn() => $name;
echo $fangfa2();
5.纯函数:将函数依赖的外部数据,通过参数的方式注入
function getName1($name):string
{
return $name;
};
echo getName1($name);
在函数外部 访问函数内部变量
1.如果外部需要函数的私有变量,可以将他作为返回数据的赠品来返回
方法就是返回一个数组,在数组中加入需要的私有变量,一起返回到函数外部
注释:在函数中有一个我们需要的私有变量,我们需要在外部调用,然后我们通过返回数组的方式,给他随便加一个数值,然后跟着我们需要的变量,组成一个数组,一起返回,然后在函数外部 我们通过 list 对返回的数组进行解构 ,就可以得到对应的参数
$my = function ()
{
$myname = '张老师';
return['这是主要返回的数据',$myname];
};
list ($myname,$myname2)=$my();
echo $myname,$myname2;
函数私有变量和外部变量同名
1.如果产生重名,函数的内部变量会覆盖外部同名变量
常量
常量的声明方式
1.define()
2.const
define和const的区别
1.define是函数,可以用在if中,但是不能用在类中
2.const 在编译阶段处理,在作用域顶部声明,可以 用在类中,但是不能用在if中
3.常量不受作用域显示,全局有效,可以直接调用
注意:
1.常量命名所有字母大写,多个单词之间用蛇形命名法
2.常量的前面不用加 $ 符
constant():显示一个常量
用const声明的常量不支持这个函数来打印
常量分为自定义常量和预定于常量,预定义常量不用定义,可以直接调用
预定义常量中有一个特殊的子集,叫魔术常量,它的值是变化的,但是它由系统自动赋值和维护更新,我们不能修改。
字符串
字符串的两种声明方法
1.单引号
单引号声明的是纯文本,不解析变量,转义特殊符号,常用在静态文本
单引号有一个语法糖 nowdoc
语法就是 一个常量 =<<< ‘xxx’ 需要包含的内容(可以是html文档) ‘xxx’;xxx相当于文档名,前后要一致
$str = <<< 'TEXT'
<header>
<nav>
<a href="">首页</a>
<a href="">视频</a>
<a href="">文章</a>
</nav>
</header>
TEXT;
2.双引号
双引号声明的是模板字符串,特点就是解析变量,转义特殊符号,使用场景就是 包含插值变量和特殊字符的动态模板
语法糖 herddoc
适用于大段的,多行的动态的文本内容,内部有变量和大量的双引号
比如html模板
$tpl = <<< PHPCN
<ul style="display:inline-grid;border:1px solid">
<li style="color: brown">php中文网</li>
<li>$domain</li>
</ul>
PHPCN;
echo $tpl;
字符串的常用函数
1.array=>string :implod(分隔符,数组名)这里的参数就是分隔符
$a =['我的','你的','他的','他们的'];
echo implode(',',$a);
2.string=>array :explode(分隔符,字符串)
$link = 'mysql:dbname=phpedu;root;root';
$db = explode(';', $link);
$tpl = 'dsn = %s<br>username = %s<br>password = %s<br>';
vprintf($tpl, $db);
3.查询,替换
//substr($str, start, size): 获取数组中的对应位置的值
三个值分别是, 数组名,起始索引,结束索引(结束索引可以不要,如果不写则拿到从起始索引后所有的值)
echo substr($str, 4, 2) . '<br>';
4.strstr(三个参数) :获取字符首次出现位置之后的字符串
三个参数分别是 变量名 需要获取的字符 第三个值如果不写默认为获取后面,如果为true则获取这个字符之前的
```$img = ‘banner.png’;
// 扩展名 .png
echo strstr($img, ‘.’). ‘<br>‘;
// true: 点之前的
echo strstr($img, ‘.’, true). ‘<br>‘;
5.strpos(三个参数) :首次出现的索引
三个参数分别是 变量名 ,需要查询的字符 ,查询的起始位置(如果从第一个字符开始的话就不用写)
//获取p的首次出现索引
echo strpos($str, ‘p’) .’<br>‘;
echo strpos($str, ‘p’, 1) .’<br>‘;
6.str_replace:字符串的替换
**defins 重定义:将一个字符定成另一个字符 相当于是起个别名 下方就是将比较长的名字直接定义成DS**
//这里有一个路径
$class = ‘\admin\controller\User’;
// ‘\’: 目录分隔符, windows, linux,macos都不相同,用系统常量来替换
// 将本来很长的目录分隔符英文,定义成缩写DS
define(‘DS’, DIRECTORY_SEPARATOR);
//然后通过替换函数 将上方路径中的 \ 替换成DS(会自动识别系统对应的分隔符)
echo str_replace(‘\‘, DS, $class) ;
比如游戏中的敏感词替换
$bad = [‘我草’,’尼玛’, ‘弱智’];
$goods = ‘**’;
$str = ‘我草,你打尼玛的游戏呢,跟尼玛个弱智一样’;
echo str_replace($bad, $goods, $str) . “<hr>“;
![](https://img.php.cn/upload/image/298/155/595/1660486234572400.png)
7.删除指定字符
strlen:获取当前字符串长度
trim(变量名):删除前后空格
rtrim(变量名):从右往左删
ltrim(变量名):从左往右删
strip_tags:过滤html标签
$str = ‘ php.cn ‘;
echo strlen($str) . ‘<br>‘;
echo strlen(trim($str)) . ‘<br>‘;
$str = trim($str);
echo rtrim($str, ‘.cn’) . ‘<br>‘;
echo ltrim($str, ‘php.’) . ‘<br>‘;
echo strip_tags(‘<h1>php.cn</h1><?php echo \’Hello\’ ?>’);
8.字符串大小写转换
strtoupper :将字符串转换成大写
strtolower :将字符串转换成小写
echo strtoupper(“hello WORLD.”);
echo strtolower(“hell WORLD.”);
9.str_shuffle :随机打乱当前字符串
echo str_shuffle(“abcdefghijklmn”);
10.str_pad :将字符串填充到指定的长度
有三个参数:变量名 填充目标值 填充内容(用什么来填充)
$str = “Hello World”;
echo str_pad($str,30,”.”);
11.bin2hex :将字符串变成16进制
$str = bin2hex(“变成16进制”);
echo($str);
```