1、PHP作用域
<?php
namespace _0810;
/**
* 作用域
* 1.php不支持块作用域
* 2.php支持函数作用域
*/
//1.php不支持块作用域
//块里定义的,外面依然可以拿到
if (true){
$a = 100;
}
echo $a . '<hr>';
//2.php支持函数作用域
$name = '朱老师';
/**
* 问题1:如何在函数内部,访问到函数外部声明的变量?
* 函数内部使用外部变量的5中方式
* 1.global
* 2.$GLOBALS['outer]
* 3.function () use ($outer) {...}闭包方式
* 4.fn()=>(...)
* 5.function ($outer) {...}
*/
function hello():string{
//js函数中可以直接访问自由变量(函数外部声明的变量)
//php不行,不能直接访问函数外部的全局变量
//1.global
global $name;
//2.$GLOBALS['outer]
return 'Hello' . $name;
}
echo hello() , '<hr>';
$name1 = '张老师';
function hello1():string{
//js函数中可以直接访问自由变量(函数外部声明的变量)
//php不行,不能直接访问函数外部的全局变量
//2.$GLOBALS['outer]
return 'Hello' . $GLOBALS['name1'];
}
echo hello1() , '<hr>';
$name2 = '李老师';
//3.function () use ($outer) {...}闭包方式
$hello3 = function () use ($name2):string{
return 'Hello' . $name2;
};
echo $hello3() , '<hr>';
$name3 = '刘老师';
//4.fn()=>(...)箭头函数自动接收变量
//箭头函数后面只能加表达式,不支持多条语句,不支持{}
$hello4 = fn() => 'Hello' . $name2;
echo $hello3() , '<hr>';
//5.纯函数方式:将函数依赖的外部数据,通过参数注入到函数内部
$name4 = '王老师';
$hello4 = function($name4):string{
return 'Hello' . $name4;
};
//直接输出时传参
echo $hello4($name4) , '<hr>';
//问题2:如何在函数外部,访问到函数内部声明的变量?
$hello5 = function (){
//私有变量
$username = '苏老师';
//如果外部需要这个私有变量,可以将它作为返回数据的赠品来返回
//返回一个数组:[正常返回的数据,私有变量]
return ['Hello world',$username];
};
//这样可以但不好,可以使用List解构赋值的方式,结构到对应的变量中
//将数组成员解构到独立变量中
List($username,$result) = $hello5();
echo $username,$result, '<hr>';
//问题3:如果函数内部的私有变量名与外部变量重名时,如何解决?
$name6 = '宋老师';
$hello6 = function () use ($name6){
//函数内部的私有变量会覆盖外部的同名变量
$name6 = '马老师';
return 'Hello world'.$name6;
};
echo $hello6();
上述运行结果:
2、PHP常量
<?php
namespace _0810;
//1.常量
//自定义常量
/**
* 1.define()
* 2.const
*/
define('USER_NAME','adimn');
const EMAIL = 'admin@php.cn';
echo USER_NAME,',',EMAIL,'<hr>';
/**
* define,const的区别
* 1.define是函数,可以用在if中,不能用在类中
* 2.const:编译阶段处理(静态处理,所以必须赋确定的值,不能是表达式),速度更快,必须在作用域顶部声明,可用在类中,不能用在类中
* 3.常量不受作用域限制,全局有效
*/
function hello():string{
return sprintf('Hello,%s,(%s)',USER_NAME,EMAIL) . '<hr>';
}
echo hello();
//constant():显示一个常量
echo USER_NAME;
echo '<hr>';
echo constant('USER_NAME');
echo '<hr>';
//const声明的常量,不能用constant来打印
//空字符可以当常量名,需要用constant来读取
define('','php中文网');
echo constant('');
echo '<hr>';
//常量非常适合用于保存一些全局数据
//好处是可以让这些数据在全局保持一致,例如版本号等等
//预定义常量
//不用define(),const
echo 'php版本' . PHP_VERSION .'<hr>';
echo '操作系统' . PHP_OS .'<hr>';
//预定义常量的子集:魔术常量,前后有两个下滑线
//它的值是变化的,是由系统自动赋值和维护,用户不能修改(只读)
echo '当前行号' . __LINE__ . '<hr>';
echo '当前文件' . __FILE__ . '<hr>';
echo '当前目录' . __DIR__ . '<hr>';
/**
* 1.声明:define(),const
* 2.查看:echo constant()
* 3.类型:自定义,预定义(魔术常量)
*/
上述运行结果:
3、PHP字符串的两种声明
<?php
namespace _0810;
//字符串的两种声明
//1.单引号
//2.双引号
//1.单引号
/**
* 1.纯文本
* (1)定界符:单引号 / nowdoc
* (2)特点:不解析变量,不转义特殊符号的转义序列
* (3)场景:静态文本,不含变量和转义符
*/
//传统的单引号
$domain = 'https://www.php.cn';
// \n是回车,\r是换行,在单引号中是不转义的
$str = '网站名称:\n\r $domain';
echo $str . '<hr>';
//单引号的语法糖nowdoc
$str = <<< 'TEXT'
<header>
<nav>
<a href="">首页</a>
<a href="">视频</a>
<a href="">文章</a>
</nav>
</header>
TEXT;
echo $str , '<hr>';
//2.双引号
/**
* 2.模板字符串
*(1)定界符:双引号 / heredoc
*(2)特点:解析变量,转义特殊符号
*(3)场景:包含产值变量和特殊字符的动态模板
*/
$site = "网站名称:\n\r \"$domain\"";
//\n \r在页面中无论有多少个,统统用空格表示,看源代码可以发现
echo $site . '<hr>';
//双引号语法糖:heredoc
//适用于大段的,多行的动态文本内容,内部有变量和大量的双引号
//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.TEXT,PHPCN:只是标识符,全大写只是行业约定,可任意命名,只要成对出现即可
* 2.nowdoc的标识符,单引号必须写,如'TXT'
* 3.heredoc:PHPCN双引号是可选的,例如PHPCN(不写双引号)也可以,推荐不写
* 4.更多转移序列:https://www.php.net/manual/zh/language.types.string.php#lang
*/
上述运行结果:
4、PHP字符串常用函数
<?php
namespace _0810;
//字符串常用函数
//1.string <->array
//array->string: implode($separator,$arr):string
$colors = ['red','green','blue'];
echo implode(',',$colors) . '<hr>';
//string->array: explode($separator,$string)
$link = 'mysql:dbname = phpedu;root;root';
//; 分割一下上面的数据库连接参数
$dbConfig = explode(';',$link);
print_r($dbConfig);
//;分隔一下上面的数据库连接参数
echo '<hr>';
list($dsn,$username,$password) = explode(';',$link);
printf('dsn=%s<br>username = %s<br>password = %s<br>',$dsn,$username,$password);
echo '<hr>';
$tpl = 'dsn=%s<br>username = %s<br>password = %s<br>';
vprintf($tpl,explode(';',$link));
echo '<hr>';
//2.查询/替换
$str = 'php.cn';
//substr($str,start,size):子串(start索引下标从0开始)
echo substr($str,0,3) . '<hr>';
echo substr($str,4,2) . '<hr>';
echo substr($str,4) . '<hr>';
//反向:n->-1,c->-2,.->-3,p->-4,h->-5,p->-6
echo substr($str,-2,2) . '<hr>';
//反向不选多少个时,也是选取后面的全部
echo substr($str,-2) . '<hr>';
//strstr:首次字符出现的位置及之后的字符
$img = 'banner.png';
//扩展名 .png
echo strstr($img,'.') . '<hr>';
//如果不想要.可以去掉
echo ltrim(strstr($img,'.'),'.') . '<hr>';
//true:点之前的
echo strstr($img,'.',true) . '<hr>';
//strpos:首次出现的索引
//delete from staff where id = 1
//从第一个位置开始找
echo strpos($str,'p') . '<hr>';
//从第二个位置开始找
echo strpos($str,'p',1) . '<hr>';
//str_replace:字符串的替换
$class = '\admin\controller\User';
//因为反斜线具有转义功能,会把后面的符号进行转义,所以需要敲两遍
echo str_replace('\\','/',$class) . '.php' . '<hr>';
// '/':目录分隔符,windows,linux,macos都不相同,用系统常量来替换(会根据当前操作系统来自动选择合适的分隔符)
echo str_replace('\\',DIRECTORY_SEPARATOR,$class) . '.php' . '<hr>';
//DIRECTORY_SEPARATOR比较长,可以进行重定义
define('DS',DIRECTORY_SEPARATOR);
echo str_replace('\\',DS,$class) . '.php' . '<hr>';
$bad = ['交友','差异','带货'];
//一一对应的替换词
//$goods = ['张老师','王老师','李老师'];
//或者直接全部替换
$goods = '**';
$str = '我用某个交友软件,找了一个天天带货的异性朋友';
echo str_replace($bad,$goods,$str) . '<hr>';
//查询长度strlen
$str = ' php.cn ';
//每一个空格也会被计入长度
echo strlen($str) . '<hr>';
//用trim可以取消对空格的计算
echo strlen(trim($str)) . '<hr>';
$str = trim($str);
//3.删除指定字符
//rtrim从右边删除
echo rtrim($str,'.cn') . '<hr>';
echo ltrim($str,'php') . '<hr>';
//strip_tags可以去掉html标签,js全部和php全部
echo strip_tags('<h1>php.cn</h1><?php echo \'Hello\' ?>');
//4.url相关
// \?后面的内容叫查询字符串,是用于get请求的,向服务器发送查询参数的,可以通过系统常量拿到这些参数
$url = 'http://phpedu.io/0810/demo4.php?a=1&b=2';
echo '<hr>';
// print_r($_SERVER);
//在上面打印的常量中,有一个[QUERY_STRING] =>里面拿到的就是查询字符串的内容
echo $_SERVER['QUERY_STRING'] . '<hr>';
//parse_str可以把一个查询字符串解析到一个数组中去
parse_str($_SERVER['QUERY_STRING'],$arr);
printf('<pre>%s</pre>',print_r($arr,true));
//parse_url()将url地址转换为数组
$arr = parse_url($url);
printf('<pre>%s</pre>',print_r($arr,true));
//Array
//(
// [scheme] => http :协议
// [host] => phpedu.io :域名
// [path] => /0810/demo4.php :脚本在服务器上的路径
// [query] => a=1&b=2 :查询字符串
//)
//以下两个完全相等
echo parse_url($url)['query'] === $_SERVER['QUERY_STRING'];
上述运行结果: