03-PHP作用域与字符串常用函数

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'];


上述运行结果:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七色的天空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值