PHP是一种运行在**服务器端**的可以**嵌入到HTML**的脚本/编程语言
服务器端:**PHP不能被浏览器解析,必须在服务器端**通过RH引擎解析成相应的HTML。
脚本/编程语言:是一种编程语言,但是不需要事先编译,**是运行时即时编译**,该语言让Web开发人员快速的书写动态生成的网页。
image.png

基本数据类型

image.png

字符串

在PHP语言中声明字符串有三种方式:

  1. 用单引号声明
  2. 用双引号声明
  3. 用字界符声明(需要输入非常大段的字符串时使用)

注意:

  1. 双引号解析变量,但是单引号不解析变量。
  2. 在双引号里面插入变量,变量后面如果有英文或中文字符,它会把这个字符和变量拼接起来,视为一整个变量。一定要在变量后面接上特殊字符,例如空格等分开或者加上{}把变量括起来。
  3. 双引号解析转义字符,单引号不解析转义字符。但,单引号能解析\’ 和\
  4. 双号和单引号可以互插,双引号当中插入单引号,单引号当中插入变量,这个变量会被解析。
  5. 我们将定界符声明字符串视为双引号一样的功能来看待。

字符串函数

数组、字符串和数据库是我们函数里面最、最、最常用的三类函数,数组和数据库我们现在还没有讲到,等讲到的时候我们再来和大家细说。
当然PHP的字符串函数也有很多。我们最常使用的两个系列的字符串:

  1. 单字节字符串处理函数
  2. 多字节字符串处理函数
  3. 字符串编码转换函数

PHP常用函数:

函数名 描述 实例
trim() 删除字符串两端的空格或其他预定义字符 “$str = “\r\nHello World!\r\n”; echo trim($str);
rtrim() 删除字符串右边的空格或其他预定义字符 “$str = “Hello World!\n\n”; echo rtrim($str);”
chop() rtrim()的别名 同上
ltrim() 删除字符串左边的空格或其他预定义字符 “$str = “\r\nHello World!”; echo ltrim($str);”
dirname() 回路径中的目录部分(我们把它归在了字符串函数里了) echo dirname(“c:/testweb/home.php”);
str_pad() 把字符串填充为指定的长度 $str = “Hello World”; echo str_pad($str,20,”.”);
str_repeat() 重复使用指定字符串 echo str_repeat(“.”,13);
str_split() 把字符串分割到数组中 print_r(str_split(“Hello”));
strrev() 反转字符串 echo strrev(“Hello World!”);
wordwrap() 按照指定长度对字符串进行折行处理 “$str = “”An example on a long word is: Supercalifragulistic””; echo wordwrap($str,15);”
str_shuffle() 随机地打乱字符串中所有字符 echo str_shuffle(“Hello World”);
parse_str() 将字符串解析成变量 “parse_str(“id=23&name=John%20Adams”,$myArray); print_r($myArray);”
number_format() 通过千位分组来格式化数字 “echo number_format(“1000000”); echo number_format(“1000000”,2); echo number_format(“1000000”,2,””,””,””.””);”
strtolower() 字符串转为小写 echo strtolower(“Hello WORLD!”);
strtoupper() 字符串转为大写 echo strtoupper(“Hello WORLD!”);
ucfirst() 字符串首字母大写 echo ucfirst(“hello world”);
ucwords() 字符串每个单词首字符转为大写 echo ucwords(“hello world”);
htmlentities() 把字符转为HTML实体 $str = “”John & ‘Adams’””; echo htmlentities($str, ENT_COMPAT);
htmlspecialchars() 预定义字符转html编码

| | nl2br() | \n转义为
标签 | echo nl2br(“One line.\nAnother line.”); | | strip_tags() | 剥去 HTML、XML 以及 PHP 的标签 | echo strip_tags(“Hello world!“); | | addcslashes() | 在指定的字符前添加反斜线转义字符串中字符 | $str = “”Hello, my name is John Adams.” echo $str; echo addcslashes($str,’m’);” | | stripcslashes() | 删除由addcslashes()添加的反斜线 | echo stripcslashes(“Hello, \my na\me is Kai Ji\m.”); | | addslashes() | 指定预定义字符前添加反斜线 | $str = “Who’s John Adams?”;echo addslashes($str); | | stripslashes() | 删除由addslashes()添加的转义字符 | echo stripslashes(“Who\‘s John Adams?”); | | quotemeta() | 在字符串中某些预定义的字符前添加反斜线 | $str = “Hello world. (can you hear me?)”; echo quotemeta($str); | | chr() | 从指定的 ASCII 值返回字符 | echo chr(052); | | ord() | 返回字符串第一个字符的 ASCII值 | echo ord(“hello”); | | strcasecmp() | 不区分大小写比较两字符串 | echo strcasecmp(“Hello world!”,”HELLO WORLD!”); | | strcmp() | 区分大小写比较两字符串 |

| | strncmp() | 比较字符串前n个字符,区分大小写 |

| | strncasecmp() | 比较字符串前n个字符,不区分大小写 | int strncasecmp ( string $str1 , string $str2 , int $len ) | | strnatcmp() | 自然顺序法比较字符串长度,区分大小写 | int strnatcmp ( string $str1 , string $str2 ) | | strnatcasecmp() | 自然顺序法比较字符串长度,不区分大小写 | int strnatcasecmp ( string $str1 , string $str2 ) | | chunk_split() | 将字符串分成小块 | str chunk_split(str $body[,int $len[,str $end]]) | | strtok() | 切开字符串 | str strtok(str $str,str $token) | | explode() | 使用一个字符串为标志分割另一个字符串 | array explode(str $sep,str $str[,int $limit]) | | implode() | 同join,将数组值用预订字符连接成字符串 | string implode ( string $glue , array $pieces ) | | substr() | 截取字符串 | string substr ( string $string , int $start [, int $length ] ) | | str_replace() | 字符串替换操作,区分大小写 | mix str_replace(mix $search,,mix $replace,mix $subject[,int &$num]) | | str_ireplace() | 字符串替换操作,不区分大小写 | mix str_ireplace ( mix $search , mix $replace , mix $subject [, int &$count ] ) | | substr_count() | 统计一个字符串,在另一个字符串中出现次数 | int substr_count ( string $haystack , string $needle [, int $offset = 0 [, int $length ]] ) | | substr_replace() | 替换字符串中某串为另一个字符串 | mixed substr_replace ( mixed $string , string $replacement , int $start [, int $length ] ) | | similar_text() | 返回两字符串相同字符的数量 | int similar_text(str $str1,str $str2) | | strchr() | 返回一个字符串在另一个字符串中开始位置到结束的字符串 | string strstr ( string $str, string $needle , bool $before_needle ) | | strrchr() | 返回一个字符串在另一个字符串中最后一次出现位置开始到末尾的字符串 | string strrchr ( string $haystack , mixed $needle ) | | stristr() | 返回一个字符串在另一个字符串中开始位置到结束的字符串,不区分大小写 | string stristr ( string $haystack , mixed $needle [, bool $before_needle = false ] ) | | strtr() | 转换字符串中的某些字符 | string strtr ( string $str , string $from , string $to ) | | strpos() | 寻找字符串中某字符最先出现的位置 | int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) | | stripos() | 寻找字符串中某字符最先出现的位置,不区分大小写 | int stripos ( string $haystack , string $needle [, int $offset ] ) | | strrpos() | 寻找某字符串中某字符最后出现的位置 | int strrpos ( string $haystack , string $needle [, int $offset = 0 ] ) | | strripos() | 寻找某字符串中某字符最后出现的位置,不区分大小写 | int strripos ( string $haystack , string $needle [, int $offset ] ) | | strspn() | 返回字符串中首次符合mask的子字符串长度 | int strspn ( string $str1 , string $str2 [, int $start [, int $length ]] ) | | strcspn() | 返回字符串中不符合mask的字符串的长度 | int strcspn ( string $str1 , string $str2 [, int $start [, int $length ]] ) | | str_word_count() | 统计字符串含有的单词数 | mix str_word_count(str $str,[]) | | strlen() | 统计字符串长度 | int strlen(str $str) | | count_chars() | 统计字符串中所有字母出现次数(0..255) | mixed count_chars ( string $string [, int $mode ] ) | | md5() | 字符串md5编码 | $str = “Hello”; echo md5($str) | | iconv |

|

| | mb_substr | 获取字符串的部分 | string mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] ) | | mb_http_output | 设置/获取 HTTP 输出字符编码 | mixed mb_http_output ([ string $encoding = mb_http_output() ] ) | | mb_strlen | 获取字符串的长度 | mixed mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] ) | | iconv | 字符串按要求的字符编码来转换 | string iconv ( string $in_charset , string $out_charset , string $str ) | | iconv_substr | 截取字符串的部分 |

| | iconv_get_encoding | 获取 iconv 扩展的内部配置变量 |

| | mb_substr_count | 统计字符串出现的次数 |

| | mb_check_encoding | 检查字符串在指定的编码里是否有效 |

| | mb_strrpos | 查找字符串在一个字符串中最后出现的位置 |

| | mb_split | 使用正则表达式分割多字节字符串 |

| | parse_url | 解释URL成为一个数组 | |

注:mb* 和iconv* 他们可以处理多字节字符,例如:中文。 中文主要用的是GBK和utf-8两种编码格式。
GBK和utf-8是两个不同的编码委员会对于汉字进行的编码的标准。
他们规定GBK是双字节,也就是一个汉字占用2Bytes。
utf-8是三字节,一个汉字占用三个字节长度的存储空间。

NULL

【重点】知道null产生的三种情况,学习empty 和 isset两个函数的区别。
主要有以下三空情况会产生空(null)类型:

  1. 通过变量赋值明确指定为变量的值为NULL
  2. 一个变量没有给任何值
  3. 使用函数unset()将变量销毁掉

**empty()**可以向括号中间传入一个变量。这个变量的值如果为false或者为null的话,返回true。
**isset()**可以向括号中间传入一个或者多个变量,变量与变量间用逗号分开。只要有有一个变量为null,则返回false。否则,则返回true。
**unset()**这个函数的功能是毁掉变量。unset(变量)括号中间插入想要毁掉的变量名,这个变量就会被毁掉。

常量

常量在代码中的定义、书写方式:
define(常量名,常量值)
注:
1.常量值只能为上一章中我们讲到的标量。
2.常量名可以小写,但是通常大写
3.常量名可以不加引号,但是通常加上引号。
4.在字符串中调用常量的时候,必须在引号外面
5.常量名建议只用字母和下划线

  1. <?php
  2. define('MY_NAME','PHP中文网');
  3. echo MY_NAME;
  4. //下面是错误的调用方式
  5. echo '我的名字是MY_NAME';
  6. //正确的调用方式该这么写
  7. echo '我的名字是' . MY_NAME;
  8. ?>

PHP中文网我的名字是MY_NAME我的名字是PHP中文网

数据类型转换

布尔值自动转换

自动类型转换,就是数据类型在某些情况下,自动会变为其他的类型参与运算。自动类型转换的发生时机是:运算和判断的时候某些值会自动进行转换。
下面的情况是布尔值判断时的自动类型转换:
1,整型的0为假,其他整型值全为真

<?php
//整型的0,换成整型的其他值试试
$bool = 0;
if($bool){
   echo '美女美女我爱你';
}else{
   echo '凤姐凤姐爱死我,执行假区间咯';
}
?>

凤姐凤姐爱死我,执行假区间咯
2, 浮点的0.0,布尔值的假。小数点后只要有一个非零的数值即为真。

<?php
//浮点类型的的0,换成其他值试试
$bool = 0.0;
if($bool){
   echo '美女美女我爱你';
}else{
   echo '凤姐凤姐爱死我,执行假区间咯';
}
?>

凤姐凤姐爱死我,执行假区间咯
3,空字符串为假,只要里面有一个空格都算真。

<?php
//空字符串,中间没有空格哟。实验完加个空格试试
$str = '';
if($str){
    echo '美女美女我爱你';
}else{
    echo '凤姐凤姐爱死我,执行假区间咯';
}
?>

凤姐凤姐爱死我,执行假区间咯
4,字符串的0,也将其看作是假。其他的都为真

<?php
//0这个字符串哟,试试其他值看看
$str = '0';
if($str){
    echo '美女美女我爱你';
}else{
    echo '凤姐凤姐爱死我,执行假区间咯';
}
?>

凤姐凤姐爱死我,执行假区间咯
5,空数组也将其视为假,只要里面有一个值,就为真。

<?php
//这个数组当中啥也没放
$arr = array();
if($arr){
    echo '美女美女我爱你';
}else{
    echo '凤姐凤姐爱死我,执行假区间咯';
}
?>

凤姐凤姐爱死我,执行假区间咯
6,空也为假

<?php
//声明了一个空的变量$bool
$bool = null;
if($bool){
    echo '美女美女我爱你';
}else{
    echo '凤姐凤姐爱死我,执行假区间咯';
}
?>

凤姐凤姐爱死我,执行假区间咯
7, 未声成功的资源也为假

<?php
//下面这段代码会显示警告,可忽略。暂时只需要对着实验知道效果即可:未声成功的资源也为假
//下面这一块了解意思就行:打开adasfasfasfdsa.txt这个不存在的文件
$res = fopen('adasfasfasfdsa.txt','r');
if($res){
    echo '美女美女我爱你';
}else{
    echo '凤姐凤姐爱死我,执行假区间咯';
}
?>

凤姐凤姐爱死我,执行假区间咯

其他类型的自动转换

只有标量在运算时会产生以下的自动类型转换:
image.png

<?php
//布尔变整型参与运算
$fo = true;
$result = $fo + 10;
//$result 结果为整型的11,因为$fo布尔的true变为了1
//如果$fo的值为0
var_dump($result);
//字符串类型
$str = '419不要爱';
$result = $str + 1;
//结果为420。因为将$str变为了整型的419参与运算
//将419放在字符串中间和结尾试试
var_dump($result);
?>

总结:布尔值的true参与运算是会变成整型或者浮点的1布尔值的false参与运算是会变成整型或者浮点的0字符串开始处是整型或浮点类型的字符,会转成对应的类型参与运算

强制类型转换

强制类型转换有三种方式:

  1. 用后面的三个函数可以完成类型转换,intval()、floatval()、strval()

    <?php
     $float = 1.23;
     $result = intval($float);
     //看看结果是不是变了?
     var_dump($result);
     //鸭脖子为整型的5
     $yabozi = 5;
     $re = floatval($yabozi);
     var_dump($re);
     //定义整型的变量
     $yabozi = 23;
     $bian = strval($yabozi);
     //强制变成字符串试试
     var_dump($bian);
    ?>
    

    int(1) float(5) string(2) “23”

  2. 变量前加上()里面写上类型,将它转换后赋值给其他变量

    <?php
    //定义一个变量,我们来变化一下试试
    $transfer = 12.8;
    //把浮点变为整型
     $jieguo = (int)$transfer;
     var_dump($jieguo);
    //把浮点变为布尔
    $jieguo = (bool) $transfer;
    var_dump($jieguo);
    //把布尔变整型
    $bool = true;
    $jieguo = (int)$bool;
    var_dump($jieguo);
     //把浮点变数组
    $fo = 250;
    $jieguo = (array)$fo;
    var_dump($jieguo);
    //其他的操作方式,按照文字总结的规律你来试试
    ?>
    

    int(12) bool(true) int(1) array(1) { [0]=> int(250) }

  3. settype(变量,类型) 直接改变量本身

    <?php
     //定义浮点变为整型
     $fo = 250.18;
    //settype第二个参数是int,你实验的时候要记得第二个参数要为字符串类型
     settype($fo,'int');
     //输出看看结果
     var_dump($fo);
    ?>
    

    int(250)

【你试试】以下是强制类型转换时的特点,每一项你做实验看看对不对:
1.空转为整型会为整型的0
2.空转为浮点会为浮点的0
3.空转为字符串会为空字符串‘’
4.浮点的123.0转为字符串会为字符串123
5.浮点的123.2转为字符串会为字符串的123.2
6.浮点即使小数点再大,它都会被干掉,会舍掉小数点后面的值
7.如果字符串转为整型的时候,如果数值在前面,会将前面的数值拿出来做为整型的转换值。
8.settype(变量,’null’); 等价于 unset()一个变量
9.$目标变量 = (类型)$操作变量 只会改变目标变量的类型,不会改变原变量的类型,Settype是改变原值

函数

函数参数

<?php
    function showMess($name) {
        return '我在'.$name.'学习~~';
    }

    echo showMess('php中文网');
<?php
$num = 10;
//function demo1(&$num) {   加上&引用和全局就是一个变量了   10   20    20
function demo1($num) {
    return $num += 10;
}
echo '全局$num是:'.$num.'<br>';  //10
echo '函数以值参数调用后的$num值是:'.demo1($num).'<br>'; //20
echo '全局$num是:'.$num; //10

默认参数:适合于实参数量小于形参,多出来的形参必须设置为默认值,而且这个默认参数必须放在函数参数列表的右边

<?php
function demo2($n=1, $m=2, $k=3) {
    return '$n+$m+$k='.($n+$m+$k);
}
echo demo2(); // 6
echo '<br>';
echo demo2(10,20);  // 33
echo '<br>';
echo demo2(10, 20, 30);  // 60

可变参数:函数可以接受任意数量的参数,适合于实际参数大于形式参数
func_get_args():用在函数体内,将函数当前的参数打包到一个数组内返回

<?php
function demo3($a, $b, $c) {
    echo '<pre>';
    print_r(func_get_args());
    echo '</pre>';
    echo func_get_arg(2);
}
demo3('html','css','javascript','php');

image.png

回调函数

回调函数,就是在处理一个功能的时候,我让这个功能自定义能力再强一些,我准许调用这个函数的时候,还可以传入一个函数配合、协助进行处理。

<?php
function woziji($one,$two,$func){
       //我规定:检查$func是否是函数,如果不是函数停止执行本段代码,返回false
       if(!is_callable($func)){
               return false;
       }

       //我把$one、$two相加,再把$one和$two传入$func这个函数中处理一次
       //$func是一个变量函数,参见变量函数这一章
       echo $one + $two + $func($one,$two);
}

//我们定义几个函数试试
function plusx2( $foo , $bar){
       $result = ($foo+$bar)*2;
       return $result;
}

function jian( $x , $y ){
   $result = $x - $y;
   return $result;
}

//调用一下函数,woziji,向里面传入参数试试
echo woziji(20,10,'plusx2');

//将plusx2改成jian试试结果
echo woziji(20,10,'jian');
?>

9040

处理过程是这样的:

  1. 将20赋值给形参$one,10赋值给了$two,而plusx2或者jian这两个变量函数,赋值给了$func
  2. 在woziji这个函数中判断plusx2或者jian是否为函数,不是函数就return false 停止执行了
  3. 显示plusx2或者jian是函数。因此$one = 20, $two =10相加了,相加后,$one和$two又带入到了了$func($one,$two)中。
  4. 带入至里面后而$func,是可变的,可以为plusx2或者jian。如果为plusx2的话,$one = 20,$two = 10 的这个两个结果又给 了plusx2函数里面的$foo和$bar
  5. $foo + $bar 乘以2后将结果返回至woziji这个函数功能体的运算处:$one + $two + $func($one,$two);
  6. 这样主得到了运算结果

现在我们明白了回调函数:在一个调数里面,再传入一个函数名,将函数名加上()括号。识为变量函数,配合执行。

变量函数

可变函数,我们也会称呼为变量函数。简单回顾一下之前的知识点:

<?php 
$hello = 'world';
$world = '你好';
//输出的结果为:你好
echo $$hello; 
?>

因为$hello先被解释成了world,再world前加上$符就输出了:你好。而变量函数的用法是这样的:

<?php
function demo(){
    echo '天王盖地虎';
}
function test(){
    echo '小鸡炖蘑菇';
}
$fu = 'demo';
//把$fu变为了demo,把demo后加上了一个括号,就执行函数了
$fu();
//把$fu的值改为test字符串再试试?
?>

天王盖地虎

<?php
function add($n, $m) {
    return '$n + $m = '.($n + $m);
}
function sub($n, $m) {
    return '$n - $m = '.($n - $m);
}
function mult($n, $m) {
    return '$n * $m = '.($n * $m);
}
$functionName = 'add';
echo $functionName(10, 5);
echo '<br>';

$functionName = 'mult';
echo call_user_func_array($functionName, [15, 3]);

echo '<hr>';
// 回调函数
function arithmetic($functionName, $a = 0, $b = 0) {
    return call_user_func_array($functionName,[$a, $b]);
}
echo arithmetic('add', 30, 20);
echo arithmetic('mult', 30, 20);

image.png

<?php
class Test {
    static function func1($site, $lang) {
        return '我在'.$site.'学习'.$lang.'编程';
    }
    public function func2($site, $lang) {
        return '我在'.$site.'学习'.$lang.'编程';
    }
}

echo call_user_func_array(['Test', 'func1'],['php中文网','php']);
echo '<hr>';
echo call_user_func_array(['Test', 'func1'],['php中文网','Java']);

image.png

匿名函数

匿名函数,也就是没有函数名的函数。匿名函数的第一种用法,直接把赋数赋值给变量,调用变量即为调用函数。

  1. 变量函数式的匿名函数

    <?php
    $greet = function($name)
    {
    echo $name.',你好';
    };
    $greet('明天');
    $greet('PHP中文网');
    ?>
    

    明天,你好PHP中文网,你好
    上例中的函数体没有函数名,通过$greent加上括号来调用的,这就是匿名函数。

  2. 回调式的匿名函数

我们将之前的例子拿过来。实际使用场景中,我们要通过一个函数实现更多的功能。但是,我又不想专门定义一个函数。我们回顾一下,我们回调函数的例子:

<?php
function woziji($one,$two,$func){
       //我规定:检查$func是否是函数,如果不是函数停止执行本段代码,返回false
       if(!is_callable($func)){
               return false;
       }

       //我把$one、$two相加,再把$one和$two传入$func这个函数中处理一次
       //$func是一个变量函数,参见变量函数这一章
       echo $one + $two + $func($one,$two);
}

woziji(20,30,function( $foo , $bar){
               $result = ($foo+$bar)*2;
               return $result;
           }
);
?>

仔细推理一下过程哟。只不过在之前的章节当中,plusx2换成了我们的匿名函数:

内部函数

内部函数,是指在函数内部又声明了一个函数。
注意事项:

  1. 内部函数名,不能是已存在的函数名
  2. 假设在函数a里面定义了一个内部函数,不能定用两次函数a。

    <?php
    function foo()
    {
      echo '我是函数foo哟,调一下我才会执行定义函数bar的过程<br />';
      function bar()
      {
           echo '在foo函数内部有个函数叫bar函数<br />';
      }
    }
    //现在还不能调用bar()函数,因为它还不存在
    bar();
    foo();
    //现在可以调用bar()函数了,因为foo()函数的执行使得bar()函数变为已定义的函数
    bar();
    //再调一次foo()看看是不是会报错?
    foo();
    ?>
    

    你会发现,在上面foo() 函数内部又定义了一个bar函数,这就是内函数数。
    仔细观察和实验后你会得出如下的结论:

  3. foo()调用两次会报错

  4. 如果不调foo()函数无法执行bar函数,因为bar是在foo的内部

变量作用域

我们通过前面的章节函数定义部份的学习我们知道了几个不同的规矩:
函数定义时后括号里面接的变量是形式上的参数(形参),与函数体外的变量没有任何关系。仅仅是在函数内部执行,函数内声明的变量也与函数外的变量没关系。
但是,我们实际的处理情况中会遇到这样的一个情况:我想在函数体内定义的变量在函数体外用;我想把函数体外的变量拿到函数体内来使用。这个时候我们就需要用到**超全局变量**。我们来回顾一下之前的知识点:
image.png
我们来通过实验来观察 一下外部变量(超全局变量)的特点,打破本章开头我们总结的规律:
我们定义一下global.html页现来写HTML内容:

<html>
  <head>
    <title>超全局数组实验</title>
  </head>
  <body>
    <!--先用POST来实验,以后你可以改成GET哟 -->
    <form action="glob.php" method="post">
      <input type="text" name="hongniu" /><br />
      <input type="submit" value="提交" />
    </form>
  </body>
</html>
<?php 
  function demo(){ 
  echo $_POST['hongniu']; 
} 
demo(); 
?>

通过这个小例子,你会发现超全局的$_POST等这一系列的超全局变量(外部变量)在函数内部也是可以用的。没有本文开始处变量作用域的限制。其实我们所有声明的变量都放到了$GLOBALS这个数组下面,举个例子:
1.通过$GLOBLAS来读取外部变量

<?php
$one = 10;
function demo(){
   $two = 100;
   $result = $two + $GLOBALS['one'];
   return $result;
}
//你会发现结果变成了110
echo demo();
?>

上例中:我们将函数体外的变量通过$GLOBALS拿到了函数体使用。所以,打破了函数外的变量不能在函数体内使用的限定。
2.通过$GLOBLAS,在函数内修改外部变量

<?php
$hongniu = '我是一个兵,来自老百姓';
function test(){
   echo '执行了函数test哟<br />';
   //调用test()函数,将通过$GLOBALS['hongniu'],把$hongniu的值改变掉
   $GLOBALS['hongniu'] = '帮助别人很快乐';
}
test();
//发现是不是输出的值变了呀?
echo $hongniu;
?>

3.通过$GLOBLAS,在函数内创建全局变量

<?php
function hello(){
   $GLOBALS['que'] = '提神喝茶更好哟';
   echo '你调了一下函数hello<br />';
}
hello();
echo $que;
?>

你调了一下函数hello
提神喝茶更好哟

文件包含函数

在实际开发中,常常需要把程序中的公用代码放到一个文件中,使用这些代码的文件只需要包含这个文件即可。这种方法有助于提高代码的重用性,给代码的编写与维护带来很大的便利。在PHP中, 有require、require_once、include、include- once四种方法包含一个文件。
image.png
include和require都是引入指定的文件。_once表示只引入一次,即之前已经引入过的不再引入。include与require除了在处理引入文件的方式不同外,最大的区别就是:include在引入不存文件时产生一个警告且脚本还会继续执行,require则会导致一个致命性错误且脚本停止执行。include()是有条件包含函数,而 require()则是无条件包含函数。include有返回值,而require没有
temp1.php

<?php
function showMess1() {
    return '欢迎来到PHP中文网学习';
}

temp2.php

<?php
function showMess2() {
    return 'PHP中文网域名是:www.php.cn';
}

include.php

<?php
// require用在开头,引入的文件内容直接替换该语句
// include适合于运行过程中,引入外部文件
require 'temp1.php';
echo showMess1();
echo '<hr>';
$on = true;
if ($on) {
    include 'temp2.php';
    echo showMess2();
} else {
    echo 'include没有引入任何文件';
}

image.png

函数表达式与闭包

<?php
$showMess = function($study) {
    return '我在'.$study.'学习~~';
};
echo $showMess('php中文网');
echo '<hr>';
//闭包:就是在一个函数内,引入了一个匿名函数,就构成一个闭包
//匿名函数中,使用use访问闭包函数中的局部变量(父级创建的变量)
function display($domain) {
    $pageTitle = 'php中文网';
    $site = function($name) use ($pageTitle) {
        return $pageTitle.'的域名是:'.$name;
    };
    return $site($domain);
}

echo display('www.php.cn');

image.png

时间函数

  1. 设置时区

设置时区的函数为:
① date_default_timezone_get()
② date_default_timezone_set()

<?php
echo date_default_timezone_get ();   //Asia/Shanghai
?>
<?php
//定义一下时区常量,以后你可以放到配置文件里
define('TIME_ZONE','Asia/shanghai');
//执行函数
date_default_timezone_set(TIME_ZONE);
echo date('Y-m-d H:i:s');   //2022-06-29 20:17:58
?>
  1. time()获取当前的unix时间戳

time()函数的功能是获取当前时间的 Unix 时间戳。以下代码输出当前时间的Unix 时间戳。

<?php
   $time=time();
   print_r( $time);  //1656505181
?>
<?php
//就可以显示出来当前的时间了哟。
echo date('Y-m-d H:i:s');        //2022-06-29 20:20:49
?>

数组

索引数组

索引数组的下标必须要从0开始吗?

<?php

$kele = array(
           '只有不断努力才能博得未来',
           10 => 'NoAlike',
           'PHP中文网' ,
           '去PHP中文网学PHP',
           19 => '凤姐和芙蓉我都爱' ,
           '杨幂我最爱'
       );

//打印显示$kele
echo '<pre>';
var_dump($kele);
echo '</pre>';
?>

array(6) { [0]=> string(36) “只有不断努力才能博得未来” [10]=> string(7) “NoAlike” [11]=> string(12) “PHP中文网” [12]=> string(21) “去PHP中文网学PHP” [19]=> string(24) “凤姐和芙蓉我都爱” [20]=> string(15) “杨幂我最爱” }

array(6) {
  [0]=>
  string(36) "只有不断努力才能博得未来"
  [10]=>
  string(7) "NoAlike"
  [11]=>
  string(12) "PHP中文网"
  [12]=>
  string(21) "去PHP中文网学PHP"
  [19]=>
  string(24) "凤姐和芙蓉我都爱"
  [20]=>
  string(15) "杨幂我最爱"
}
<?php
$arr1 = array('java', 'php', 'c++');
echo '<pre>';
print_r($arr1);
echo '<pre>';

echo '<hr>';
$arr2 = array('a'=>'java', 'b'=>'php', 'c'=>'c++');
echo '<pre>';
print_r($arr2);
echo '<pre>';

image.png

索引数组的增加、修改和删除

增加:数组变量名[]、数组变量名[键值]这两种方式来增加元素。键值的增长规则与之前的规则一样。都是最大值加1的原则。
修改:用变量名[键] = 新值。就把数组中的值定的值修改了。
删除:

<?php
$minren = array(
           '杨幂',
           '王珞丹',
           '刘亦菲',
           '黄圣依',
           '范冰冰'
       );
//假设我不喜欢:黄圣依,如何将黄圣依给删掉掉呢?
//如果删除掉后范冰冰的下标为多少呢?
//如果在后面再追加一个元素,会填掉:“黄圣依”留下来的空吗?
unset($minren[3]);
$minren[] = '金星';
echo '<pre>';
var_dump($minren);
echo '</pre>';
?>

array(5) { [0]=> string(6) “杨幂” [1]=> string(9) “王珞丹” [2]=> string(9) “刘亦菲” [4]=> string(9) “范冰冰” [5]=> string(6) “金星” }

1.使用unset删除变量的方式来删除数组里面的值。 2.删除了中间的值,并不会让后面的下标向前自动移动。而是原来的值为多少就为多少 3.删除掉其中的某个值,新加入的值不会替换掉原来的位置,依然遵循最大值加1的原则。

索引数组的其他声明方式

  1. 直接用之前未声明的变量,用变量名后面接中括号的方式声明数组。

    <?php
     //直接写一个变量后面加上中括号,声明变量
     $qi[] = '可口可乐';
     $qi[10] ='百事可乐';
     echo '<pre>';
     var_dump($qi);
     echo '</pre>';
    ?>
    

    array(2) { [0]=> string(12) “可口可乐” [10]=> string(12) “百事可乐” }

  2. 每次用array()写的太麻烦了,还可以不用写array哟,更简单。

    <?php
    $minren = [
            '杨幂',
            '王珞丹',
            100 => '刘亦菲',
            '黄圣依',
            '范冰冰'
        ];
    echo '<pre>';
    var_dump($minren);
    echo '</pre>';
    ?>
    

    array(5) { [0]=> string(6) “杨幂” [1]=> string(9) “王珞丹” [100]=> string(9) “刘亦菲” [101]=> string(9) “黄圣依” [102]=> string(9) “范冰冰” }

关联数组

索引数组适当的变一下形就出现了关联数组。只要数组里面有一个为字符串的数组,就为关联数组。

<?php

//声明一下关联数组
$rela = array(
       '帅' => '陈奕迅',
);


//再来玩玩简洁声明
$drink = [
        '美' => '凤姐',
        'verymei' => '杨幂',
        100 => '孙俪',
        '娘娘',
       ];


// 输出 $rela
echo '<pre>';
var_dump($rela);
echo '</pre>';

// 输出$drink
echo '<pre>';
var_dump($drink);
echo '</pre>';
?>

image.png

遍历数组

for循环遍历索引和关联数组

<?php
// 1.for索引数组遍历
$arr = range(1,10);
for ($i = 0; $i < count($arr); $i++) {
    echo $i.'->'.$arr[$i].'<br>';
}

// 2.for关联数组遍历
$arr = ['name'=>'peter', 'age'=>23, 'sex'=>'male'];
for ($i = 0; $i < count($arr); $i++) {
    echo key($arr),'->',current($arr),'<br>';
    next($arr);
}

image.png

while循环遍历索引和关联数组

<?php
$arr = range(1, 10, 2); //[1,3,5,7,9]
$i = 0;
while ($i < count($arr)) {
    echo $i.'->'.$arr[$i].'<br>';
    $i++;
}

$arr = ['name'=>'peter','age'=>24, 'isMarried'=>true];
$i = 0;
while ($i < count($arr)) {
    echo key($arr).'->'.current($arr).'<br>';
    next($arr);
    $i++;
}

image.png

foreach遍历索引和关联数组。注意:$key 和$value并不是变量名必须得为这两个名字。你命名为其他的也可以,如 $kai => $wen是一样的。 你要清楚键赋值给了哪个变量,值赋值给了另外的哪个变量。

<?php
$arr = [1, 3, 5, 7, 9];
foreach($arr as $key=>$value) {
    echo $key.'=>'.$value.'<br>';
}

$arr = ['name'=>'peter', 'age'=>23, 'isMarried'=>true];
foreach ($arr as $key=>$value) {
    echo $key.'=>'.$value.'<br>';
}

image.png

list和each遍历数组
list的功能就是从左到右,一一对应索引数组从0开始的下标值。

<?php

list($one , $two , $three) = array('张三' ,'李四' ,'王五');

//再次声明:单引号不结释变量,所以输出的是字符串$one
echo '$one----'.$one.'<br />';
echo '$two----'.$two.'<br />';
echo '$three----'.$three.'<br />';

?>

array each ( array &$array )
功能:传入一个数组。它会将其中的一个元素拆为个新数组。每次执行这样操作一个元素。执行一次先后移动一次,同样的方式操作下一个数组元素。执行到最后,返回false。

<?php

//定义一个变量叫$kongjie(空姐)
$kongjie=[
   'gao'=>'穿黑衣服的',
   'shou'=>'退特别长特别细',
   'mei'=>'好白',
   'pl'=>'五官端正',
   'type'=>'那就是女神',
   '我是吊丝不敢跟女神搭讪'
   ];

//第一次each
$data = each($kongjie);

echo '<pre>';
var_dump($data);
echo '</pre>';
?>

image.png

总结:
读取了$kongjie中的第一个元素,将第一个元素(’gao’=>’穿黑衣服的’)分解开了。

  1. 分解后第一个元素变成了一个新数组。
  2. 在新数组里面,将原值(穿黑衣服的)放了索引下标1里面,同时放到了关联下标value里面。
  3. 在新数组里面,将原键(gao),放到了关联下标key里面,放到了索引下标0里面。
$arr = ['name'=>'peter','age'=>28,'isMarried'=>true];
while (list($key, $value)=each($arr)) {
    echo '我的'.$key.'是:'.$value.'<br>';
}

image.png
接下来我们说说each的另外一个特性。读一次,向后移动一个元素。

<?php

//定义一个变量叫$kongjie(空姐)
$kongjie=[
   'gao'=>'穿黑衣服的',
   'shou'=>'退特别长特别细',
   'mei'=>'好白',
   ];

//第一次each
$data = each($kongjie);

echo '<pre>';
var_dump($data);
echo '</pre>';

echo '-----华丽丽分割线------<br />';


//第2次each
$data = each($kongjie);

echo '<pre>';
var_dump($data);
echo '</pre>';

echo '-----华丽丽分割线------<br />';

//第3次each【执行到了最后一个元素了】
$data = each($kongjie);

echo '<pre>';
var_dump($data);
echo '</pre>';

echo '-----华丽丽分割线------<br />';

//第4次【此时,后面已没有可操作的元素了,看返回什么】
$data = each($kongjie);

echo '<pre>';
var_dump($data);
echo '</pre>';

echo '-----华丽丽分割线------<br />';

?>

image.png

总结: 1.读一次向后移动一次【可以想象有一个记录的箭头在移动】,将其中的每个元素拆解成一个新数组 2.读取到最后,没有可操作的元素了,所以返回了false。

list($key,$value) = each($array);

<?php
//定义一个变量叫$kongjie(空姐)
$kongjie=[
   'gao'=>'穿黑衣服的',
   'shou'=>'腿特别长特别细',
   'mei'=>'好白',
   ];
list($key,$value) = each($kongjie);
echo $key. '-----' .$value .'<br />';
?>

gao——-穿黑衣服的

总结:

  1. each 把变量拆成了4个元素
  2. 而list把0 =>gao 赋值给了变量$key
  3. list把1 => 穿黑衣服的 赋值给了变量 $value

each到最后会返回false,因此我可以用布尔型循环while来配合完成数组的循环。把上面的代码,轻轻一改就实现了如下效果:

<?php
//定义一个变量叫$kongjie(空姐)
$kongjie=[
   'gao'=>'穿黑衣服的',
   'shou'=>'退特别长特别细',
   'mei'=>'好白',
   ];
while(list($key,$value) = each($kongjie)){
   echo $key. '-----' .$value .'<br />';
}
?>

gao——-穿黑衣服的
shou——-退特别长特别细
mei——-好白

遍历多维数组

foreach($data as $value){
   //第一次循环把国家的数组赋值给了$value
   //第二次循环把中国的省份的数组又赋值给了$value
   //因此,我在循环的时候把$value再遍历一次
   foreach($value as $k => $v){
           echo $k . '-----' . $v .'<br />';
   }
   //为了看的更清晰,我在中间加上华丽丽的分割线方便你来分析
   echo '----------分割线-----------<br />';
}

数组函数

PHP7 - 图19

image.png
mixed array_shift ( array &$array ) 功能:弹出数组中的第一个元素

<?php
$mingren = array("邓超", "黄晓明", "宁泽涛", "钟汉良");
$dc = array_shift($mingren);
echo $dc .'<br />';
print_r($mingren);
?>

邓超
Array ( [0] => 黄晓明 [1] => 宁泽涛 [2] => 钟汉良 )

int array_unshift ( array &$数组 , mixed $值1 [, mixed $… ] ) 功能:向指数组的开始处压入一个或多个元素,返回的是总个数。

<?php
$mingren = array("邓超", "黄晓明");
$dc = array_unshift($mingren , "宁泽涛", "钟汉良");
echo $dc .'<br />';
print_r($mingren);
?>

4
Array ( [0] => 宁泽涛 [1] => 钟汉良 [2] => 邓超 [3] => 黄晓明 )

mixed array_pop ( array &$array ) 功能:弹出数组末尾的一个元素

<?php
$mingren = array("邓超", "黄晓明", "宁泽涛", "钟汉良");
$dc = array_pop($mingren);
echo $dc .'<br />';
print_r($mingren);
?>

钟汉良
Array ( [0] => 邓超 [1] => 黄晓明 [2] => 宁泽涛 )

int array_push ( array &$array , mixed $value1 [, mixed $… ] ) 功能:向指数组末尾处压入一个或多个元素,返回的是总个数。

<?php
$mingren = array("邓超", "黄晓明");
$dc = array_push($mingren , "宁泽涛", "钟汉良");
echo $dc .'<br />';
print_r($mingren);
?>

4
Array ( [0] => 邓超 [1] => 黄晓明 [2] => 宁泽涛 [3] => 钟汉良 )

current,key,prev,next,reset 功能演示 这几个函数功能已经说的很清楚了。我们通过代码来进行演示:

<?php
$t=array(
   '我们',
   'yy'=>'永远',
   'dbg'=>'需要不断奋进',
   'djn'=>'才能开创未来'
   );


//读取数组的值
echo current($t).'<br />';
//读取数组的键
echo key($t).'<br />';

//向后移动一下
next($t);

//再读值和键
echo current($t).'<br />';

echo key($t).'<br />';


//向后移动一下
next($t);
echo current($t).'<br />';

echo key($t).'<br />';


//向前移动一下
prev($t);
echo current($t).'<br />';
echo key($t).'<br />';


//移到末尾
end($t);
echo current($t).'<br />';
echo key($t).'<br />';

//移至开始处
reset($t);
echo current($t).'<br />';

echo key($t).'<br />';

//销毁数组
unset($t);
var_dump($t);
?>

我们
0
永远
yy
需要不断奋进
dbg
永远
yy
才能开创未来
djn
我们
0
NULL

image.png
image.png

array_values():将当前数组元素的值,全部取出后重新打包到一个默认索引数组中

<?php
//array_values():将当前数组元素的值,全部取出后重新打包到一个默认索引数组中
////默认索引数组:下标从0开始递增的索引数组,其实就是省略掉键名的数组
//用在只需要对数组元素的值感兴趣的场合,例如大量数据的搜索等
$arr = ['name'=>'peter','age'=>28,'isMarried'=>true];
$arr1 = array_values($arr);
echo '<pre>';
print_r($arr1);
echo '</pre>';

image.png

array_keys()函数:将数组的键名打包到一个默认索引数组中

<?php
$arr = ['name'=>'peter','age'=>28,'isMarried'=>'male'];
$keyArr = array_keys($arr);
echo '<pre>';
print_r($keyArr);
echo '</pre>';
echo '<hr>';
for ($i = 0; $i < count($keyArr); $i++) {
    echo '我的'.$keyArr[$i].'是'.$arr[$keyArr[$i]].'<br>';
}

image.png

key exists()函数:检测键名是否存在于数组

<?php
$arr = ['name'=>'peter', 'age'=>23, 'sex'=>'male'];
$key = 'marr';
$res = array_key_exists($key, $arr);
var_dump($res);

in array()和array_search()函数:查询数组中是否存在某个值

<?php
$arr = ['name'=>'peter', 'age'=>23, 'sex'=>'male'];
$value = 'peter';
$res = in_array($value, $arr, true); //true:值与类型完全匹配
var_dump($res);

//array_search():找到返回数组键名,找不到返回空

count() 和 array_count_values():统计元素个数

<?php
$arr = [1, 2, 3, 4, ['a','b',[5,6,7]]];
echo '<pre>';
print_r($arr);
echo '</pre>';
echo '$arr数组元素个数是:'.count($arr, 0); // 5
echo '<hr>';
echo echo '$arr数组元素个数是(包括多维数组):'.count($arr, 1);  // 11
<?php
//统计元素值出现的次数,返回关联数组,键星原数组的值,值是该值出现的次数
//要统计的数组元素的值必须是整数或者字符串,否则会抛出警告,
//因为这些值要被转为新数组的键,而键名必须是整数或字符串
$arr = ['name'=>'peter', 'age'=>23, 'sex'=>'male'];
$countArr = array_count_values($arr);
echo '<pre>';
print_r($countArr);
echo '<pre>';

array_filter()数组过滤器函数:使用回调函数处理数组元素的值
image.png

array_walk()函数:用回调函数实现对数组的遍历与更新
image.png
image.png

array_map:同时处理多个数据
image.png

<?php
$arr1 = [1,2,3,4,5];
$arr2 = ['杭州','深圳','成都','苏州','南京'];
$func1 = function($value1, $value2) {
    return '第${value1}个城市是{$value2}';
};
$newArr1 = array_map($func1, $arr1, $arr2);
echo '<pre>';
print_r($newArr1);

image.png

sort从小到大,rsort从大到小

PDO

连接数据库

<?php
try {
    $dbh = new PDO('mysql:host=localhost1;dbname=db_csi_oasys', 'root', 'root');
    echo '<pre>';
    foreach($dbh->query('SELECT * from books') as $row) {
        print_r($row);
    }
    echo '<pre>';
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

关闭连接

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// 在此使用连接

// 现在运行完成,在此关闭连接
$dbh = null;
?>

正则表达式

正则表达示我们其实之前经常看到,它主要用在以下一些地方:
匹配邮箱、手机号码、验证码
替换敏感的关键词。例如:涉及政治和骂人的话
文章采集。
早期的表情替换技术,ubb文件编码、markdown编辑器替换等
以后自己写模板引擎也需要用到正则表达示
其他….

定界符,就是定一个边界,边界已内的就是正则表达示。
定界符:不能用a-zA-Z0-9\ 其他的都可以用。必须成对出现,有开始就有结束。
我们来例几个例子:

例子 说明
/中间写正则/ 正确
$中间写正则$ 正确
%中间写正则% 正确
^中间写正则^ 正确
@中间写正则@ 正确
(中间写正则) 错误
A中间写正则A 错误

注:\ 是转义字符,如果在以后正则表达示里面需要匹配/,如下图:
/ / /
这个时候真要匹配/ 的时候,需要把定界符里面的/ 用转义字符转义一下,写成下面的例子:
/ \/ /
如果你觉得麻烦,遇到这种需要转义的字符的时候可以把两个正斜线(/ /)定界,改为其他的定界符(# #)。

原子:原子是正则表达示里面的最小单位,原子说白了就是需要匹配的内容。一个成立的正则表达示当中必须最少要有一个原子。所有可见不可见的字符就是原子
说明:我们见到的空格、回车、换行、0-9、A-Za-z、中文、标点符号、特殊符号全为原子。

在做原子的实例前我们先来讲解一个函数

preg_match:int preg_match ( string $正则 , string $字符串 [, array &$结果] )

功能:根据$正则变量,匹配$字符串变量。如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回0。
注:上面是preg_match常用的主要几个参数。我在上面将另外几个参数没有列出来。因为,另外两个参数太不常用了。
我们来通过实验来证明:

<?php
$zz = '/[^0-9A-Za-z_]/';
$string = 'aaaaab311dd';
$string1 = '!$@!#%$#^##';
if(preg_match($zz, $string, $matches)){
 echo '匹配到了,结果为:';
 var_dump($matches);
}else{
 echo '没有匹配到';
}
?>

因为我希望的是匹配a,而$string当是是不存在a的,所以不成功。

<?php
$zz = '/wq/';
$string = 'ssssswqaaaaaa';
if(preg_match($zz, $string, $matches)){
   echo '匹配到了,结果为:';
   var_dump($matches);
}else{
   echo '没有匹配到';
}
?>

匹配到了,结果为:array(1) { [0]=> string(2) “wq” }

特殊标识的原子

原子 说明
\d 匹配一个0-9
\D 除了0-9以外的所有字符
\w a-zA-Z0-9_
\W 除了0-9A-Za-z_以外的所有字符
\s 匹配所有空白字符\n \t \r 空格
\S 匹配所有非空白字符
[ ] 指定范围的原子

元字符
抛出问题: \d 代表匹配一个字符。而我现在想要匹配十个八个,任意多个数字肿么办?这个时候我们就要用到元字符。在使用原子的时候,发现只能够匹配一个字符,可是要匹配多个字符就出现了问题。这个时候,我们需要借助元字符来帮我们修饰原子,实现更多的功能。

元字符 功能说明
* 是代表匹配前面的一个原子,匹配0次或者任意多次前面的字符。
+ 匹配一次或多前前面的一个字符
? 前面的字符可有可无【可选】 有或没有
. 更标准一些应该把点算作原子。匹配除了\n以外的所有字符
image.png 或者。注:它的优先级最低了。
^ 必须要以抑扬符之后的字符串开始
$ 必须要以$之前的字符结尾
\b 词边界
\B 非边界
{m} 有且只能出现m次
{n,m} 可以出现n到m次
{m,} 至少m次,最大次数不限制
() 改变优先级或者将某个字符串视为一个整体,匹配到的数据取出来也可以使用它


我不希望正则表达示特别贪婪的匹配全部,只匹配一部份怎么办?这个时候,我们就需要用到下面的这些模式匹配来增强正则的功能。常用的模式匹配符有:

模式匹配符 功能
i 模式中的字符将同时匹配大小写字母.
m 字符串视为多行
s 将字符串视为单行,换行符作为普通字符.
x 将模式中的空白忽略.
A 强制仅从目标字符串的开头开始匹配.
D 模式中的美元元字符仅匹配目标字符串的结尾.
U 匹配最近的字符串.

模式匹配符的用法如下:/ 正则表达示/模式匹配符
模式匹配符是放在这句话的最后的。例如:/\w+/s
格式我们清楚了,接下来最主要的是加强对于模式匹配符使用的理解和记忆。我们通过代码来理解加上和不加模式匹配符有何区别。

命名空间

  1. 函数命名空间 ```php <?php /**
    • 命名空间解决了函数的全局命名冲突的问题
    • 如果代码使用了命名空间,那么所有代码必须写道命名空间中 */ namespace a { function hello() { return ‘命名空间是:’.NAMESPACE.’
      函数名称是:’.FUNCTION; } }

namespace b { function hello() { return ‘命名空间是:’.NAMESPACE.’
函数名称是:’.FUNCTION; } }

namespace { echo a\hello(); echo ‘


‘; echo b\hello(); } ?>

![image.png](https://cdn.nlark.com/yuque/0/2022/png/1590333/1656642596628-17f20cd9-f1a4-400e-be54-2f6ad64fb8a2.png#clientId=u089a2f02-fc9c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=104&id=u143a9eb7&margin=%5Bobject%20Object%5D&name=image.png&originHeight=114&originWidth=541&originalType=binary&ratio=1&rotation=0&showTitle=false&size=6002&status=done&style=none&taskId=u32b93a78-bf47-4ad0-a7e0-cb4013dbddb&title=&width=491.81817115831007)

2. **类的命名空间**
```php
<?php
//命名空间解决了类的全局命名冲突问题
namespace a {
    class A {
        public $name = 'renhaoshuai';
        public function say(){
            $namespace = '命名空间:'.__NAMESPACE__;
            $className = '类名'.__CLASS__;
            $methodName = '方法名:'.__METHOD__;
            return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.$this->name;
        }
    }
}

namespace b {
    class B {
        public $name = 'renzhenshuai';
        public function say(){
            $namespace = '命名空间:'.__NAMESPACE__;
            $className = '类名'.__CLASS__;
            $methodName = '方法名:'.__METHOD__;
            return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.$this->name;
        }
    }
}

namespace {
    echo (new a\A)->say();
}

image.png

  1. 常量命名空间

image.png

image.png

  1. 命名空间中的普通变量 ```php <?php namespace a { $title = ‘PHP中文网‘; echo ‘当前空间的变量:’.$title.’
    ‘; }

namespace b { echo ‘访问另一个空间的变量:’.$title; }

![image.png](https://cdn.nlark.com/yuque/0/2022/png/1590333/1656644149950-cdcf39e8-920f-480f-837d-118303d81b83.png#clientId=u089a2f02-fc9c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=138&id=u532b88ee&margin=%5Bobject%20Object%5D&name=image.png&originHeight=152&originWidth=682&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8310&status=done&style=none&taskId=u91416eb2-a851-4474-b3c1-0631d197dc9&title=&width=619.9999865618622)

5. **命名空间的分层机制**
```php
<?php
/**
 * 将命名空间进行分级管理,可以使不同空间的代码之间的逻辑关系更加的清晰将有
 一定层级关系的命名空间的标识符之间用反斜线进行分隔\
 */
namespace father {
    const SITE_NAME = 'PHP中文网';
}

namespace father\sub {
    const DOMATN = 'www.php.cn';
}

namespace {
    echo father\SITE_NAME.'的域名是:'.father\sub\DOMATN;
}

image.png

  1. 命名空间简化写法 ```php <?php namespace app\index\controller; const CITY = ‘合肥’; function say() { return ‘大湖名城,创建高地’; }

class User { public function hello() { return ‘PHP是一门快速开发’; } }

use const app\index\controller\CITY; use function app\index\controller\say; use function app\index\controller\User; echo CITY.’
‘; echo say().’
‘; $user = new User; echo $user->hello(); ``` image.png

文件处理

  1. 文件信息

image.png

  1. 文件路径

image.png

  1. 文件操作

image.png