超全的PHP进阶知识点

简介: 超全的PHP进阶知识点

前文基础知识

超详细的PHP入门知识点讲解_coleak的博客-CSDN博客_php

coleak的PHP知识专栏

static关键字

当一个函数完成时,它的所有变量通常都会被删除。

然而,有时候希望某个局部变量不要被删除。请在第一次声明变量时使用 static 关键字

预定义常量

PHP预定义了许多常量,这些常量无需使用define()函数定义,可直接在程序中使用。下面列举了一些常用的PHP预定义常量。

DIRECTORY_SEPARATOR: 表示目录分隔符,UNIX或Linux操作系统环境时的值为“ / ”, Window操作系统环境时的值为 “ \ ”

PHP_OS: PHP所在的操作系统的类型

1. <?php
2. echo __FILE__.PHP_EOL;
3. echo __LINE__.PHP_EOL;
4. echo PHP_VERSION.PHP_EOL;
5. echo PHP_OS.PHP_EOL;
6. echo DIRECTORY_SEPARATOR.PHP_EOL;
7. ?>

E:\phpproject\mypro1\index.php

3

7.4.22

WINNT

\

引号区别

1. <?php
2. $name='coleak';
3. //双引号里面变量输出变量的值
4. $str ="这是 $name 的测试";
5. //单引号里面有变量都作为一个字符串处理
6. $str1 ='这是 $name 的测试';
7. echo $str.PHP_EOL;
8. echo $str1;
9. ?>

字符串函数

trim() 函数移除字符串两侧的空白字符或其他预定义字符。

1. <?php
2. $str=' cole ak _xiao ak ';
3. echo $str." 一共有 ".strlen($str)."字符".PHP_EOL;
4. echo trim($str).PHP_EOL;
5. echo strpos($str,'ak').PHP_EOL;
6. echo substr($str,strpos($str,'ak'),7).PHP_EOL;
7. $a1=str_replace('a','y',$str);
8. echo $a1;
9. ?>

cole ak _xiao ak  一共有 18字符

cole ak _xiao ak

6

ak _xia

cole yk _xiyo yk

数组进阶

1. <?php
2. $a=[1,2,3,4,'coleak'];
3. $b=array(1,2,3,4,'coleak');
4. foreach ($a as $key => $value) {
5. echo '数组第 '.$key.' 个元素的值是:'.$value.PHP_EOL;
6. }
7. $num=0;
8. foreach ($b as $value)
9. {
10. echo "数组第 $num 个元素的值是: $value ".PHP_EOL;
11. $num++;
12. }
13. ?>

数组第 0 个元素的值是:1

数组第 1 个元素的值是:2

数组第 2 个元素的值是:3

数组第 3 个元素的值是:4

数组第 4 个元素的值是:coleak

数组第 0 个元素的值是: 1

数组第 1 个元素的值是: 2

数组第 2 个元素的值是: 3

数组第 3 个元素的值是: 4

数组第 4 个元素的值是: coleak

1. <?php
2. $cars=array("Volvo","BMW","Toyota");//简单的数组
3. echo count($cars).PHP_EOL;//count()返回数组的长度
4. $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");//关联数组
5. //其中包含多个键值对
6. echo "Peter is " . $age['Peter'] . " years old.".PHP_EOL;
7. foreach($age as $x=>$value)//关联数组的遍历方法
8. {
9. echo "Key=" . $x . ", Value=" . $value.PHP_EOL;
10. }
11. ?>

sort() - 对数组进行升序排列

rsort() - 对数组进行降序排列

asort() - 根据关联数组的值,对数组进行升序排列

ksort() - 根据关联数组的键,对数组进行升序排列

arsort() - 根据关联数组的值,对数组进行降序排列

krsort() - 根据关联数组的键,对数组进行降序排列

数组合并

1. <?php
2. $array1 =array('a','b','c');
3. $array2 = array('a1'=>'php','a2'=>'python','a3'=>'java');
4. $array3 = array_merge($array1,$array2);
5. foreach ($array3 as $item=>$value)
6. {
7. echo "key= $item 的值为 $value".PHP_EOL;
8. }
9. array_push($array1,'d','e');
10. print_r($array1);
11. ?>

key= 0 的值为 a

key= 1 的值为 b

key= 2 的值为 c

key= a1 的值为 php

key= a2 的值为 python

key= a3 的值为 java

Array

(

   [0] => a

   [1] => b

   [2] => c

   [3] => d

   [4] => e

)

下表为空 自动添加参数

1. <?php
2. $array1[]='d';
3. $array1[]='c';
4. var_dump($array1);
5. $array1['a4']='javasciprt';
6. print_r($array1);
7. ?>

array(2) {

 [0]=>

 string(1) "d"

 [1]=>

 string(1) "c"

}

Array

(

   [0] => d

   [1] => c

   [a4] => javasciprt

)

unset 销毁指定的元素

1. <?php
2. $array1 = array('a', 'b', 'c', 'd', 'e');
3. unset($array1[2]);
4. print_r($array1);
5. array_pop($array1);
6. print_r($array1);
7. $array1[0]='aaa';
8. print_r($array1);
9. ?>

Array

(

   [0] => a

   [1] => b

   [3] => d

   [4] => e

)

Array

(

   [0] => a

   [1] => b

   [3] => d

)

Array

(

   [0] => aaa

   [1] => b

   [3] => d

)

函数进阶

匿名函数

匿名函数就是没有名字的函数。

将一个匿名函数"赋值"给一个变量——此时该变量就代表该匿名函数了

1. <?php
2. $callfunction=function($name){
3. return $name;
4. };
5. echo $callfunction('coleak');
6. ?>

回调函数

1. <?php
2. function Speak($a,$b)
3. {
4. echo "This is ".$a.PHP_EOL;
5. echo "This is ".$b;
6. }
7. function Speak_Test()
8. {
9. return call_user_func_array('Speak',array('Chinese','English'));
10. }
11. Speak_Test()
12. ?>

变量作用域

PHP 有三种不同的变量作用域:

local(局部)

global(全局)

static(静态)

PHP 同时在名为 $GLOBALS[index] 的数组中存储了所有的全局变量。下标存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量。

1. <?php
2. $x=5;
3. $y=10;
4. function myTest1() {
5. return $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
6. }
7. function myTest2()
8. {
9. global $x,$y;
10. return $x+$y;
11. }
12. echo myTest1().PHP_EOL;
13. echo myTest2();
14. ?>

15

20

类进阶

继承

PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承

接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。接口中定义的所有方法都必须是公有,这是接口的特性。要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。

1. <?php
2. interface Demo
3. {
4. const NAME = 'coleak';
5. const URL = 'http://test.cn/index.html';
6. function fun1();
7. function fun2();
8. }
9. class Website implements Demo
10. {
11. public function fun1()
12.     {
13. echo self::NAME;
14.     }
15. public function fun2(){
16. echo self::URL;
17.     }
18. }
19. $obj = new Website();
20. $obj -> fun1();
21. echo PHP_EOL;
22. $obj -> fun2();
23. ?>

常量

可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。

1. <?php
2. class MyClass
3. {
4. const constant = '常量值';
5. var $var1='var1';
6. public $var2="var2";
7. function showConstant() {
8. echo  self::constant . PHP_EOL;
9.     }
10. function showvars()
11.     {
12. self::showConstant();
13. echo $this->var1.PHP_EOL;
14. echo $this->var2;
15.     }
16. }
17. echo MyClass::constant . PHP_EOL;
18. $classname = "MyClass";
19. echo $classname::constant . PHP_EOL; // 自 5.3.0 起
20. $class = new MyClass();
21. echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起
22. $class->showConstant();
23. $class->showvars();
24. ?>

常量值

常量值

常量值

常量值

常量值

var1

var2

抽象类

子类方法可以包含父类抽象方法中不存在的可选参数

1. <?php
2. abstract class AbstractClass
3. {
4. abstract protected function prefixName($name);
5. }
6. class ConcreteClass extends AbstractClass
7. {
8. public function prefixName($name, $separator = ".")
9.     {
10. if ($name == "man") {
11. $prefix = "Mr";
12.         } elseif ($name == "woman") {
13. $prefix = "Mrs";
14.         } else
15.         {
16. $prefix = "";
17.         }
18. return "{$prefix}{$separator} {$name}";
19.     }
20. }
21. $class = new ConcreteClass;
22. echo $class->prefixName("man"), "\n";
23. echo $class->prefixName("woman"), "\n";
24. ?>
1. 1. 接口
2. (1)对接口的使用是通过关键字implements
3. (2)接口不能定义成员变量(包括类静态变量),能定义常量
4. (3)子类必须实现接口定义的所有方法
5. (4)接口只能定义不能实现该方法
6. (5)接口没有构造函数
7. (6)接口中的方法和实现它的类默认都是public类型的
8. 2. 抽象类
9. (1)对抽象类的使用是通过关键字extends
10. (2)不能被实例化,可以定义子类必须实现的方法
11. (3)子类必须定义父类中的所有抽象方法,这些方法的访问控制必须和父类中一样(或者更为宽松)
12. (4)如一个类中有一个抽象方法,则该类必须定义为抽象类
13. (5)抽象类可以有构造函数
14. (6)抽象类中的方法可以使用private,protected,public来修饰。
15. (7)一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。

Static 关键字

声明类属性或方法为 static(静态),就可以不实例化类而直接访问。

静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。

静态属性不可以由对象通过 -> 操作符来访问。

自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。

php中const与static的区别:1、const只能修饰类的属性,static可以修饰属性和方法;2、const一旦被定义不可更改,static修饰的变量是可以被更改的;3、const不需要变量符号,而static需要。

1. <?php
2. class Foo
3. {
4. static $my_static = 'foo';
5. function staticValue() {
6. return self::$my_static;
7.     }
8. }
9. echo Foo::$my_static . PHP_EOL;
10. $foo = new Foo();
11. print $foo->staticValue() . PHP_EOL;
12. ?>

Final

如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。

PHP 不会在子类的构造方法中自动的调用父类的构造方法

PHP超级全局变量

PHP超级全局变量列表:

  1. $GLOBALS  一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
  2. $_SERVER  一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组
  3. $_REQUEST  用于收集HTML表单提交的数据。
  4. $_POST  广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。
  5. $_GET  广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。

Array []

  1. $_FILES
  2. $_ENV
  3. $_COOKIE
  4. $_SESSION

文件包含

include 和 require 语句是相同的,除了错误处理方面:

require 会生成致命错误(E_COMPILE_ERROR)并停止脚本

include 只生成警告(E_WARNING),并且脚本会继续

语法

include 'filename';和require 'filename';

文件处理

文件字节数即输出

1. <?php
2. echo readfile("mycont.txt");
3. ?>

读取此文件并写到输出流(如读取成功则 readfile() 函数返回字节数)

count=字节数+2*(行数-1)

文件打开/读取/关闭/写入

fread() 的第一个参数包含待读取文件的文件名,第二个参数规定待读取的最大字节数。

1. <?php
2. $myfile = fopen("mycont.txt", "r")
3. or
4. die("Unable to open file!");
5. //echo fread($myfile,filesize('mycont.txt'));
6. echo fgets($myfile);
7. echo fgets($myfile);
8. echo fgets($myfile);
9. fclose($myfile);
10. ?>

fopen

1. <?php
2. $myfile = fopen("newfile.txt", "w") or
3. die("Unable to open file!");
4. $txt = "coleak1\n";
5. fwrite($myfile, $txt);
6. $txt = "coleak2\n";
7. fwrite($myfile, $txt);
8. fclose($myfile);
9. ?>

其他文件操作

php文件重命名:函数rename()。

php文件复制:函数copy();

php文件删除:函数unlink();

file_exists() 判断文件是否存在

is_file() 是否为文件。

文件属性获取

1. <?php
2. $file = 'newfile.txt';
3. file_exists($file) or die('文件不存在,程序退出!');
4. echo $file.' 文件大小是:'.filesize($file).' 个字节'.PHP_EOL;
5. if(is_readable($file)){
6. echo $file.' 文件是可读的。'.PHP_EOL;
7. }else{
8. echo $file.' 文件是不可读的。'.PHP_EOL;
9. }
10. if(is_writable($file)){
11. echo $file.' 文件是可写的。'.PHP_EOL;
12. }else{
13. echo $file.' 文件是不可写的。'.PHP_EOL;
14. }
15. if(is_executable($file)){
16. echo $file.' 文件是可执行的。'.PHP_EOL;
17. }else{
18. echo $file.' 文件是不可执行的。'.PHP_EOL;
19. }
20. echo '文件的创建时间是:'.date('Y-m-d H:i:s',filectime($file)).'。'.PHP_EOL;
21. echo '文件的修改时间是:'.date('Y-m-d H:i:s',filemtime($file)).'。'.PHP_EOL;
22. echo '文件上次的访问时间是:'.date('Y-m-d H:i:s',fileatime($file)).'。'.PHP_EOL;
23. ?>

目录操作

新建目录:mkdir(路径,权限,递归创建)

删除目录:rmdir()

移动(改名):rename()

获取目录内容:

//打开目录

目录句柄 = opendir()

//读取目录

文件名 = readdir(目录句柄)

依次读取文件名,同时向下移动文件句柄指针,读取不到则返回false

//关闭目录

closedir()

递归读取目录内容

1. <?php
2. //递归遍历目录
3. $dirfile="c:/";
4. function tree($dirfile)
5. {
6. $dir = opendir($dirfile);
7. while (($file = readdir($dir)) !== false)
8.     {
9. if(is_dir("$dirfile{$file}") && ($file !=".") && ($file !="..")){
10. if(is_readable("$dirfile{$file}")){
11. echo "目录 $dirfile{$file} ".PHP_EOL;
12. tree("$dirfile{$file}");
13.             }else
14.             {
15. echo "目录 $dirfile{$file} 不可访问".PHP_EOL;
16.             }
17.         }
18. else{
19. if( ($file !=".") && ($file !="..")){
20. echo "文件 $dirfile/{$file}".PHP_EOL;
21.             }
22.         }
23.     }
24. closedir($dir);
25. }
26. tree($dirfile);
27. ?>

正则表达式

经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~)

元字符是用于构造规则表达式的具有特殊含义的字符。如果要在正则表达式中包含元字符本身,必须在其前加上”\”进行转义

1. 元字符      说明
2. *        0次、1次或多次匹配其前的原子
3. +        1次或多次匹配其前的原子
4. ?        0次或1次匹配其前的原子
5. |        匹配两个或多个选择
6. ^        匹配字符串串首的原子
7. $        匹配字符串串尾的原子
8. []       匹配方括号中的任一原子
9. [^]      匹配除方括号中的原子外的任何字符
10. {m}     表示其前原子恰好出现m次
11. {m,n}     表示其前原子至少出现m次,至多出现n次(n>m)
12. {m,}      表示其前原子出现不少于m次
13. ()        整体表示一个原子
14. .       匹配除换行之外的任何一个字符

phpstorm报错解决

phpstorm运行时显示warning:Unable to load dynamic library 'mysqli' 库配置路径错误

发现错误提示的目录不是我的php的安装目录,它找库的地方是不对的。

打开php.ini

;extension_dir = "ext"注释打开修改为:

extension_dir = “E:\apa\php-7.4.22\ext”

注:E:\apa\php-7.4.22\ext为我的PHP各种库的安装目录。

目录
相关文章
|
7月前
|
存储 JavaScript 前端开发
PHP的基础知识点解析
PHP的基础知识点解析
|
10月前
|
关系型数据库 MySQL BI
mysql高级进阶:php语句操作mysql进行最大值、最小值、平均值和中位数的报表导出方案
mysql高级进阶:php语句操作mysql进行最大值、最小值、平均值和中位数的报表导出方案
99 0
|
SQL 关系型数据库 MySQL
PHP一共有哪些知识点?
PHP一共有哪些知识点?
|
设计模式 SQL 开发框架
学PHP语言如何进阶?具体步骤是怎样的?底层原理是什么?
学PHP语言如何进阶?具体步骤是怎样的?底层原理是什么?
|
开发框架 移动开发 网络协议
php进阶编程-easyswoole框架的学习和开发
php进阶编程-easyswoole框架的学习和开发
132 0
php进阶编程-easyswoole框架的学习和开发
|
存储 NoSQL 前端开发
PHP程序员进阶之路3
PHP程序员进阶之路3
116 0
|
NoSQL 前端开发 关系型数据库
PHP程序员进阶之路2
PHP程序员进阶之路2
104 0
|
前端开发 JavaScript 关系型数据库
PHP程序员进阶之路1
PHP程序员进阶之路1
97 0
|
NoSQL 前端开发 关系型数据库
PHP程序员进阶之路
PHP程序员进阶之路
130 0
|
SQL 安全 前端开发
网络安全-php安全知识点
网络安全-php安全知识点
129 0
网络安全-php安全知识点