PHP - 基础知识总结
引用变量考点
Demo1
$a = range(0,10);
$b = $a;
//此时$a和$b同指向一个内存空间,内存大小不会发生作用
$a = range(0,10);
//$a的值虽然没有变化,但进行了写操作,触发PHP的写时复制Copy On Write)工作原理
Demo2 引用&
$a = range(0,10);
$b = &$a;
$a = range(0,10);
PHP在对变量进行&引用时不会再开辟内存空间,两个变量永远指向一个空间,不会再开辟新的空间,我自己的理解就是&绕过了写实复制的执行。
Demo3 unset只会取消引用 不会销毁空间
$a = 1;
$b = &$a;
unset($b);
echo $a;
Demo4 对象(Object)是特殊的变量
Class Person {
public $name = "zhangsan";
}
$p1 = new Person;
$p2 = $p1;
$p2->name = 'stark';
echo $p2->name;
对象具有结构的特殊性,他不会对内存空间有复制性,对象本身就是引用传递
Demo5 clone 的作用
Class Person {
public $name = "zhangsan";
}
$p1 = new Person;
$p2 = clone $p1;
$p2->name = 'stark';
echo $p2->name;
echo $p1->name;
clone 的作用就是让同一个对象指向不同的地址
Demo6 PHP的深复制和潜复制
//php浅拷贝和深拷贝
//对象1 = 对象2 浅拷贝 同时指向一个内存地址
//对象1 = clone 对象2 深拷贝 复制以后 分别指向不存的内存地址
class A{
public $num = 1;
}
$a = new A();
$b = $a;//浅拷贝
$b->num = 2;
echo $a->num; //a 和 b 指向同一内存地址 所以a的值改变
$c = clone $a;
$c->num = 3;//a 和 c 指向不同的内存地址 所以a的值不变 仅改变c对应的内存地址的值
echo $a->num;
常量及数据类型
Demo1 PHP字符串定义的方式及各自的区别
PHP字符串定义的方式:单引号、双引号、heredoc和newdoc。
区别:单引号不能解析变量,单引号不能解析转义字符、只能解析单引号和反斜线本身,变量和变量、变量和字符串,字符串和字符串之间用.连接。
Demo2 浮点数不能运用到运算计算中
$a = 0.1;
$b = 0.7;
if( $a+$b == 0.8 ){
echo 2;
}else{
echo 1;
}
PHP不能进行浮点数计算,CPU在计算浮点数时,先转换成二进制,导致值不正确。
False的七中情况
False的七中情况:0, 0.0, “”,“0”,false, array(), NULL
Null的三中情况
Null的三中情况:直接赋值为Null、未定义的变量、unset销毁的变量
Demo3 超全局数组
PHP预定义数组(超全局数组),我们在代码的任何位置都可以使用。
$_SERVER 服务器变量 客户端ip 网址 运行文件
$_GET 接收get参数
$_POST 接收post参数
$_REQUEST 可以接收 get post cookie
$_FILES 接收文件
$_COOKIE 接收cookie 会话控制
$_SESSION 接收session 会话控制
$GLOBALS 接收全局变量(全局变量的列表)
需要注意的变量:
# 当前运行脚本所在服务器的 IP 地址
$_SERVER['SERVER_ADDR']
# 当前运行脚本所在服务器的主机名。如果脚本运行于虚拟主机中,该名称就由那个虚拟主机所设置的值决定
$_SERVER['SERVER_NAME']
# 客户端信息
$_SERVER['HTTP_USER_AGENT']
# 客户端IP地址
$_SERVER['REMOTE_ADDR']
...
常量
定义:const、 define ,常量一经定义,不能被修改,不能被删除
效率:const更快,是语言结构,define是函数
预定义常量:
__FILE__ 当前PHP文件的相对路径
__LINE__ 当前PHP文件中所在的行号
__FUNCTION__ 当前函数名,只对函数内调用起作用
__CLASS__ 当前类名,只对类起作用
运算符的优先级 && 流程控制
Demo1 PHP运算符的优先级
运算符优先级
递增/递减 > ! > 算术运算符 > 大小比较 > (不)相等比较 > 引用 > 位运算符(^) > 位运算符(|) > 逻辑与 > 逻辑或 > 三目 > 赋值 > and > xor > or
括号的使用可以增加代码的可读性
Demo2 和= 的区别
== 判断的是值相等 === 类型和值都相等
Demo3 递增/递减运算符
递增/递减运算符不影响布尔值
递减 NULL 值没有效果
递增 NULL值为1
递增和递减在前就先运算符后返回,反之先返回,后运算
Demo4 运算符优先级考点 && 短路作用
$a = 0;
$b = 0;
if( $a = 3 > 0 || $b=3 >0 ){
// > 优先级最大 ,$a = true , ||后面因为短路作用所以不执行
$a++; // true
$b++; // 1
echo $a,$b;
}
当变量值为true时,$a++还等于1
Demo5 遍历数组
遍历数组的三种方式:使用for循环、使用foreach循环、使用while、list()、each()组合循环。
for循环只能遍历索引数组,foreach可以遍历索引和关联数组,联合使用list(),each()和while循环同样可以遍历索引和关联数组。
for和foreach循环那个效率更高?foreach,因为foreach在内存里就已经循环了
Demo6 PHP分支考点
if...elseif
if( $fraction > 60 ){
echo '合格';
} elseif ($fraction >= 60 && $fraction < 80 ){
echo '良好';
} else {
echo '优秀';
}
在elseif语句中只能有一个表达式为true,即在elseif语句中只有一个语句块被执行,多个elseif从句是排斥关系。
使用elseif语句有一个基本原则,总把优先范围小的条件放在前面处理。
Switch
$favfruit="orange";
switch ($favfruit) {
case "apple":
echo "Your favorite fruit is apple!";
break;
case "banana":
echo "Your favorite fruit is banana!";
break;
case "orange":
echo "Your favorite fruit is orange!";
break;
default:
echo "Your favorite fruit is neither apple, banana, or orange!";
}
工作原理:
1.对表达式(通常是变量)进行一次计算
2.把表达式的值与结构中 case 的值进行比较
3.如果存在匹配,则执行与 case 关联的代码
4.代码执行后,break 语句阻止代码跳入下一个 case 中继续执行
5.如果没有 case 为真,则使用 default 语句
目录和文件考点
Demo1 文件目录相关考察点
fopen() : fopen() 函数打开文件或者 URL,如果打开失败,本函数返回 FALSE。
fopen(filename,mode,include_path,context);
参数 | 描述 |
---|---|
filename | 必需。规定要打开的文件或 URL |
mode | 必需。规定要求到该文件/流的访问类型 |
include_path | 可选。如果也需要在 include_path 中检索文件的话,可以将该参数设为 1 或 TRUE |
context | 可选。规定文件句柄的环境。Context 是可以修改流的行为的一套选项。 |
说明:
fopen() 将 filename 指定的名字资源绑定到一个流上。如果 filename 是 "scheme://..." 的格式,则被当成一个 URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。如果该协议尚未注册封装协议,PHP 将发出一条消息来帮助检查脚本中潜在的问题并将 filename 当成一个普通的文件名继续执行下去。
如果 PHP 认为 filename 指定的是一个本地文件,将尝试在该文件上打开一个流。该文件必须是 PHP 可以访问的,因此需要确认文件访问权限允许该访问。如果激活了安全模式或者 open_basedir 则会应用进一步的限制。
如果 PHP 认为 filename 指定的是一个已注册的协议,而该协议被注册为一个网络 URL,PHP 将检查并确认 allow_url_fopen 已被激活。如果关闭了,PHP 将发出一个警告,而 fopen 的调用则失败。
提示和注释:
不同的操作系统家族具有不同的行结束习惯。当写入一个文本文件并想插入一个新行时,需要使用符合操作系统的行结束符号。基于 Unix 的系统使用 \n 作为行结束字符,基于 Windows 的系统使用 \r\n 作为行结束字符,基于 Macintosh 的系统使用 \r 作为行结束字符。 如果写入文件时使用了错误的行结束符号,则其它应用程序打开这些文件时可能会表现得很怪异。
Windows 下提供了一个文本转换标记("t")可以透明地将 \n 转换为 \r\n。与此对应还可以使用 "b" 来强制使用二进制模式,这样就不会转换数据。要使用这些标记,要么用 "b" 或者用 "t" 作为 mode 参数的最后一个字符。
默认的转换模式依赖于 SAPI 和所使用的 PHP 版本,因此为了便于移植鼓励总是指定恰当的标记。如果是操作纯文本文件并在脚本中使用了 \n 作为行结束符,但还要期望这些文件可以被其它应用程序例如 Notepad 读取,则在 mode 中使用 "t"。在所有其它情况下使用 "b"。
在操作二进制文件时如果没有指定 "b" 标记,可能会碰到一些奇怪的问题,包括坏掉的图片文件以及关于 \r\n 字符的奇怪问题。
注释:为移植性考虑,强烈建议在用 fopen() 打开文件时总是使用 "b" 标记。
注释:再一次,为移植性考虑,强烈建议你重写那些依赖于 "t" 模式的代码使其使用正确的行结束符并改成 "b" 模式。
$file = fopen("test.txt","r");
$file = fopen("/home/test/test.txt","r");
$file = fopen("/home/test/test.gif","wb");
$file = fopen("http://www.example.com/","r");
$file = fopen("ftp://user:password@example.com/test.txt","w");
其他文件读取函数:
file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] ) : string
file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) : int
file — 把整个文件读入一个数组中
// 将一个文件读入数组。本例中通过 HTTP 从 URL 中取得 HTML 源文件。
$lines = file('http://www.example.com/');
// 在数组中循环,显示 HTML 的源文件并加上行号。
foreach ($lines as $line_num => $line) {
echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}
// 另一个例子将 web 页面读入字符串。参见 file_get_contents()。
$html = implode('', file('http://www.example.com/'));
// 从 PHP 5 开始可以使用可选标记参数
$trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
访问远程文件:开启allow_url_fopen,HTTP协议链接只能使用只读,FTP协议可以使用只读或者只写
Demo2 目录操作函数考察点
名称相关:basename,dirname,pathinfo
目录读取:opendir,readdir,closedir
basename — 给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名。
如果文件名是以 suffix 结束的,那这一部分也会被去掉。
echo "1) ".basename("/etc/sudoers.d", ".d").PHP_EOL;
echo "2) ".basename("/etc/passwd").PHP_EOL;
echo "3) ".basename("/etc/").PHP_EOL;
echo "4) ".basename(".").PHP_EOL;
echo "5) ".basename("/");
dirname — 返回路径中的目录部分
dirname ( string $path ) : string
dirname('c:/x'); // 返回 'c:'
dirname('c:/Temp/x'); // 返回 'c:/Temp'
dirname('/x'); // 返回 '\'
给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。
pathinfo — 返回文件路径的信息
pathinfo ( string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] ) : mixed
pathinfo() 返回一个关联数组包含有 path 的信息。返回关联数组还是字符串取决于 options。
opendir — 打开目录句柄
opendir ( string $path [, resource $context ] ) : resource
打开一个目录句柄,可用于之后的 closedir(),readdir() 和 rewinddir() 调用中。
返回值:
如果成功则返回目录句柄的 resource,失败则返回 FALSE。
如果 path 不是一个合法的目录或者因为权限限制或文件系统错误而不能打开目录,opendir() 返回 FALSE 并产生一个 E_WARNING 级别的 PHP 错误信息。可以在 opendir() 前面加上“@”符号来抑制错误信息的输出。
readdir — 从目录句柄中读取条目
readdir ([ resource $dir_handle ] ) : string
返回目录中下一个文件的文件名。文件名以在文件系统中的排序返回。
// 注意在 4.0.0-RC2 之前不存在 !== 运算符
if ($handle = opendir('/path/to/files')) {
echo "Directory handle: $handle\n";
echo "Files:\n";
/* 这是正确地遍历目录方法 */
while (false !== ($file = readdir($handle))) {
echo "$file\n";
}
/* 这是错误地遍历目录的方法 */
while ($file = readdir($handle)) {
echo "$file\n";
}
closedir($handle);
}
closedir — 关闭目录句柄
closedir ([ resource $dir_handle ] ) : void
关闭由 dir_handle 指定的目录流。流必须之前被 opendir() 所打开。
filesize — 取得文件大小
filesize ( string $filename ) : int
返回值:
返回文件大小的字节数,如果出错返回 FALSE 并生成一条 E_WARNING 级的错误。
disk_free_space — 返回目录中的可用空间
disk_free_space ( string $directory ) : float
disk_free_space — 返回目录中的可用空间,给出一个包含有一个目录的字符串,本函数将根据相应的文件系统或磁盘分区返回可用的字节数。
// $df 包含根目录下可用的字节数
$df = disk_free_space("/");
//在 Windows 下:
$df_c = disk_free_space("C:");
$df_d = disk_free_space("D:");
disk_total_space — 返回一个目录的磁盘总大小
disk_total_space ( string $directory ) : float
disk_total_space — 返回一个目录的磁盘总大小,给出一个包含有一个目录的字符串,本函数将根据相应的文件系统或磁盘分区返回所有的字节数。
copy — 拷贝文件
copy ( string $source , string $dest [, resource $context ] ) : bool
如果要移动文件的话,请使用 rename() 函数。
$file = 'example.txt';
$newfile = 'example.txt.bak';
if (!copy($file, $newfile)) {
echo "failed to copy $file...\n";
}
unlink — 删除文件
unlink ( string $filename [, resource $context ] ) : bool
unlink — 删除文件,删除 filename。和 Unix C 的 unlink() 函数相似。 发生错误时会产生一个 E_WARNING 级别的错误。
返回值:
成功时返回 TRUE, 或者在失败时返回 FALSE。
文件锁:flock
文件指针:ftell,fseek,rewind
需要注意的点:
1.牢记文件操作函数及几种打开模式
2.理解目录的操作步骤
3.尝试练习完成目录的复制和删除函数的编写
$file = '2020-09-15.log';
$handle = fopen($file,'r');
$contents = fread($handle,filesize($handle));
$contents = ' Hello,World '.$contents;
fclose($handle);
$handle = fopen($file,'w');
fwrite($handle,$contents);
fclose($handle);
常见试题:PHP遍历文件夹和文件夹下面的文件
function loopDir($dir){
$handle = opendir($dir);
while(false !== ($file = readdir($handle) ) ){
if($file != '.' && $file != '..'){
echo $file."\n";
if(filetype($dir.'/'.$file) == 'dir'){
loopDir($dir.'/'.$file);
}
}
}
}
面向对象和魔术方法
https://blog.csdn.net/xuezhiwu001/article/details/107287023
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?