目录
1、echo(),print(),print_r(),var_dump()的区别?
2、表单中 get与post提交方法的区别?
4、请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
5、HTTP 状态中302、403、 500代码含义?
6、语句include和require的区别是什么?为避免多次包含同一文件,可用什么语句代替它们?
7、php垃圾回收机制
8、堆和栈的区别?
9、php垃圾回收机制
10.数组排序有冒泡排序法、选择排序法、插入排序法和快速排序法。
11、双引号和单引号的区别
12、请解释PHP中的GD库是什么?
14、git跟其他版本控制器有什么区别?
15、PHP 中对象是按值传递还是按引用传递?
16、请解释PHP中的缓存是什么?
17、请解释PHP中的Composer是什么?
18、 请解释PHP中的PSR是什么?
19、请解释PHP中的异常处理是什么
20、PHP常见运行模式
21、smarty是什么,有什么作用
22、isset() 和 empty() 区别
23、mb_strlen和str_len的区别?
24、用PHP打印出前一天的时间格式是2023-5-10 22:21:21
25、用PHP写出显示客户端IP与服务器IP的代码
26、http 与 https 的区别
27、== 与 === 的区别
28、mkdir()和@mkdir()之间有什么区别?
29、for 和 foreach 有什么区别
30、php7、php8 新特性
31、怎么实现跨域请求 ?
32、静态路由和动态路由
33、分布式环境下Session怎么处理
34、禁用Cookie的session使用方案
35、unlink()、unset() 函数的作用是
36、PHP是什么?它的优点是什么?
37、 解释一下PHP中的面向对象编程(OOP)和面向过程编程(POP)的区别
38、PHP中如何处理文件的读取和写入
39、 什么是PHP中的超全局变量?列举几个常用的超全局变量。
40、在PHP中error_reporting这个函数有什么作用?
41、PHP如何实现页面跳转几种方式
42、如果需要原样输出用户输入的内容,在数据入库前,要用哪个函数处理
43、php实现字符串反转的几种方式
44、PHP中的错误类型
45、权限管理(RBAC)的实现
46、PHP如何实现静态化
echo是PHP语句, print和print_r、dump是函数 echo没有返回值 输出一个或者多个字符串 print()只能打印出简单类型变量的值(如int,string) print_r() 可以打印出复杂类型变量的值(如数组,对象) dump()可以打印所有类型变量,并且可以输出具体信息类型和长度
get是发送请求HTTP协议通过url参数传递进行接收 而post是实体数据,可以通过表单提交大量信息.
session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的一般 用于后台和安全性比较高的地方。 cookie:是存储在客户端,对于Cookie来说是存储在用户浏览器下面的,一般用户 登陆,负载压力比较大的地方。可以减轻服务器的负载。
按值传递:函数范围内对值的任何改变在函数外部都会被忽略 按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说, 这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。
302:临时转移成功,请求的内容已转移到新位置 403 (禁止) 服务器拒绝请求。 404 (未找到) 服务器找不到请求的网页。 500 (服务器内部错误) 服务器遇到错误,无法完成请求
区别: 在失败的时候: include产生一个warning,而require产生直接产生错误中断 require在运行前载入 include在运行时载入 代替: require_once include_once
自动释放程序不需要内存块,对象被变量引用时,引用计数器+1, 执行unset后,计数器-1,计数器=0或脚本执行完,对象销毁,垃圾回收完成 (php7后null,bool,int和double的类型变量不计数)
A、堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小; B、栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义。
自动释放程序不需要内存块,对象被变量引用时,引用计数器+1, 执行unset后,计数器-1,计数器=0或脚本执行完,对象销毁,垃圾回收完成 (php7后null,bool,int和double的类型变量不计数)
1、冒泡排序法。冒泡排序是一个比较简单的排序方法。在待排序的数列基本有序的情况下排序速度较快 2、选择排序法。选择法的原理是先将第一个数与后面的每一个数依次比较,不断将将小的赋给第一个数,从而找出最小的值。 3、插入排序法。插入排序对少量元素的排序较为有效。 4、快速排序法。快速排序法的原理是通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
双引号解释变量,单引号不解释变量 双引号里插入单引号,其中单引号里如果有变量的话,变量解释 双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用{}讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误 双引号解释转义字符,单引号不解释转义字符,但是解释’\和\ 能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断)
GD库是一种PHP扩展,用于生成和操作图像。GD库提供了一组函数,可以创建和操作图像,例如绘制线条、矩形、圆形和多边形等,也可以处理图像,例如缩放、裁剪和旋转等。
可以通过使用令牌(token)来实现用户认证,可以通过请求头或者URL参数的方式传递。
GIT是分布式版本控制系统,其他类似于SVN是集中式版本控制系统。
分布式区别于集中式在于:每个节点的地位都是平等,拥有自己的版本库,在没有网络的情况下,对工作空间内代码的修改可以提交到本地仓库,此时的本地仓库相当于集中式的远程仓库,可以基于本地仓库进行提交、撤销等常规操作,从而方便日常开发。
在 PHP 中,对象是按引用传递的。这意味着当将一个对象赋值给另一个变量或将对象作为参数传递给函数时,实际上是传递对象的引用,而不是对象的副本。 当对象被赋值给一个新的变量时,两个变量将引用同一个对象。对其中一个变量所做的更改也会影响到另一个变量。 示例代码:class MyClass { public $property; } $obj1 = new MyClass(); $obj1->property = 'Value'; $obj2 = $obj1; // 将$obj1赋值给$obj2 $obj2->property = 'New Value'; echo $obj1->property; // 输出 "New Value"
缓存是一种将数据存储在内存或其他快速介质中的技术,以便快速地访问和提高应用程序的性能。在PHP中,可以使用缓存库,例如Memcached和Redis等,来实现缓存,可以将数据存储在内存中,并提供快速的访问和查询。
Composer是一种PHP依赖管理工具,可以自动化地安装、更新和管理PHP包和依赖项。在PHP中,可以使用Composer来管理应用程序的依赖项,以便于开发人员快速地构建和部署PHP应用程序
PSR(PHP Standard Recommendation)是一组PHP标准,旨在提高PHP代码的互操作性和可读性。PSR包括PSR-1、PSR-2、PSR-3、PSR-4和PSR-7等标准,涵盖了编码风格、自动加载、日志和HTTP消息等方面
异常处理是一种处理程序错误和异常情况的技术,可以使应用程序在出现错误时更加健壮和可靠。在PHP中,可以使用try/catch块来捕获和处理异常,可以使用throw语句来抛出自定义异常,以便于更好地管理和处理错误。
在PHP中,常见的运行模式有以下几种:
- CGI模式(Common Gateway Interface):CGI模式是最早的PHP运行模式,每次请求都会启动一个独立的进程来处理,适用于简单的网站或者低并发的场景。由于进程的创建和销毁开销较大,性能相对较低。
- 模块(Module)模式:在Web服务器中,将PHP解析器作为一个模块嵌入到服务器中,与服务器进程共享内存空间,通过内部函数调用来处理PHP脚本。模块模式具有较高的性能,适用于高并发的场景。
- FastCGI模式(Fast Common Gateway Interface):FastCGI是一种性能较高的CGI模式,通过保持PHP解析器的进程常驻内存,减少了进程的创建和销毁开销。FastCGI模式适用于高并发的Web应用程序。
- CLI模式(Command Line Interface):CLI模式是通过命令行方式运行PHP脚本,适用于一些后台任务、脚本执行等不需要通过Web服务器访问的场景。
- PHP-FPM(PHP FastCGI Process Manager)模式:PHP-FPM是一种基于FastCGI的PHP进程管理器,通过独立的进程管理和处理PHP请求。PHP-FPM模式适用于高并发的Web应用程序,可以配置进程池、线程数等参数,提高PHP应用的性能和稳定性。 根据实际需求和场景选择合适的PHP运行模式可以提高程序的性能和稳定性。
它的作用是将PHP代码与HTML代码分离,使开发者可以更方便地管理和维护前端代码。Smarty通过使用模板标签和变量替代PHP代码,实现了模板与业务逻辑的分离。它可以帮助开发者更好地组织和重用模板代码,提高开发效率和代码可维护性。Smarty支持模板继承、条件判断、循环、过滤器等功能,可以灵活地适应各种模板需求。同时,Smarty还提供了插件机制,允许开发者自定义扩展功能,满足更复杂的业务需求。总之,Smarty在PHP开发中起到了简化模板设计和开发过程、提高代码可读性和可维护性的作用。
Isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则
strlen
函数是PHP的内置函数,用于计算字符串的字节数。它不考虑字符的多字节编码,将字符串视为一系列字节,并返回该字符串的字节数。mb_strlen
函数是mbstring
扩展提供的函数,用于计算字符串的字符数。它可以正确处理多字节字符,例如UTF-8编码的字符。mb_strlen
函数根据字符的编码来计算字符数,并返回该字符串的字符数。 因此,当需要处理包含多字节字符的字符串时,应该使用mb_strlen
函数来获取正确的字符数。对于仅包含单字节字符的字符串,可以使用strlen
函数来获取字节数。需要注意的是,在使用mb_strlen
函数之前,需要确保已经加载了mbstring
扩展。
date('Y-m-d H:i:s', strtotime('-1 days'));
打印客户端IP: $_SERVER['REMOTE_ADDR'];
打印服务器IP: gethostbyname("www.bolaiwu.com");
- 安全性:HTTP是明文传输的协议,数据在传输过程中是以明文形式进行传输的,容易被窃听和篡改。而HTTPS通过使用SSL/TLS协议对数据进行加密和身份验证,确保传输的数据是加密的,并且保证通信双方的身份。
- 端口号:HTTP使用的默认端口号是80,而HTTPS使用的默认端口号是443。当在浏览器中输入URL时,如果是以http://开头,默认使用80端口;如果是以https://开头,默认使用443端口。
- 证书:HTTPS需要使用数字证书来进行身份验证和加密,证书由可信的第三方机构颁发,用于确认网站的真实性。而HTTP不需要证书,不具备身份验证和加密功能。
- 性能:由于HTTPS需要对数据进行加密和解密的操作,相比HTTP会增加一定的计算和传输开销,因此HTTPS的性能可能会稍差于HTTP。 综上所述,HTTPS相比HTTP具有更高的安全性,可以保护数据的机密性和完整性,并且可以确保通信双方的身份。因此,在涉及隐私数据传输或需要保护用户信息的场景下,使用HTTPS是更好的选择。而在一些不涉及敏感信息传输的场景下,使用HTTP可以更加简单和高效。
==不考虑类型相等
===类型也要相等
@代表所有warning忽略
for
循环使用计数器和明确条件,适用于遍历数组和字符串。foreach
循环自动遍历数组和可迭代对象,简化代码。for比foreach快,for直接通过
索引,foreach需额外指针
PHP 7的新特性:
- 标量类型声明:可以在函数参数和返回值中声明标量类型(int、float、string、bool)。
- 返回类型声明:可以在函数定义中声明返回值的类型。
- 异常处理改进:引入了
Throwable
接口,更好地处理异常。- Null合并运算符(
??
):简化了处理可能为null的变量的操作。- 太空船操作符(
<=>
):用于比较两个值,返回-1、0或1。- 匿名类:可以在使用时定义匿名类而不需要显式命名。
- 常量数组:可以使用
define()
定义常量数组。- PHP 8的新特性:
- JIT编译器:引入了Just-In-Time(即时)编译器,提高了代码的执行效率。
- 属性的类型声明:可以在类的属性上声明类型。
- 构造函数的参数推断:根据属性声明的类型自动推断构造函数的参数类型。
- 新的字符串函数:引入了一些新的字符串处理函数,如
str_contains()
、str_starts_with()
和str_ends_with()
等。- Match表达式:类似于
switch
语句,但更简洁易读。- Null安全操作符:通过使用
?
来处理可能为null的属性和方法调用。- 强制命名参数:允许在函数调用时使用参数名进行传递,提高了代码的可读性。 这些新特性在不同版本的PHP中提供了更多的功能和性能改进,可以根据具体的需求来选择合适的版本。
服务器在响应中添加
Access-Control-Allow-Origin
头指定允许跨域请求的域名
- 静态路由: 静态路由是指将URL直接映射到特定的代码处理程序或控制器上。在静态路由中,每个URL都与一个固定的代码处理程序或控制器绑定。当请求的URL与已定义的路由规则匹配时,相应的代码处理程序或控制器将被执行。静态路由通常在应用程序初始化时就已经定义好,不会在运行时发生变化。
- 动态路由: 动态路由是指根据URL的参数或模式来确定要执行的代码的过程。在动态路由中,URL可以包含变量或参数,并且这些变量或参数的值可以在运行时动态地传递给代码处理程序或控制器。动态路由通常用于处理不同的URL模式,例如带有不同标识符或参数的URL。通过动态路由,可以根据不同的URL模式执行相同的代码处理程序或控制器。
- 共享Session存储:将Session数据存储在一个共享的存储介质中,如数据库、分布式缓存或分布式文件系统。各个服务器通过访问这个共享存储来读取和写入Session数据,确保不同服务器之间的Session数据一致性。
- 粘性Session:将每个客户端请求绑定到一个具体的服务器上,并在后续的请求中保持这个绑定关系。服务器只需维护自己的Session数据,不需要与其他服务器进行数据同步。但若某个服务器宕机,绑定在它上面的Session数据将丢失。
- 无状态Session:服务器不保存Session数据,而是将所有状态信息保存在客户端。每个请求都携带完整的Session数据。此方式减轻了服务器负担,但需要考虑数据安全性和传输效率问题
- URL重写:在每个URL中添加Session标识符作为查询参数。例如,原始URL为
http://example.com/page
,使用Session标识符重写后的URL为http://example.com/page?session_id=xxxxx
,服务器通过解析URL中的session_id参数来获取对应的Session数据。- 隐藏表单字段:在每个表单中添加一个隐藏字段,用于传递Session标识符。当用户提交表单时,服务器通过解析隐藏字段的值来获取对应的Session数据
unlink()
函数的作用是用于删除文件。它接受一个文件路径作为参数,如果文件存在,则将其删除;如果文件不存在,则不进行任何操作。
unset()
函数的作用是用于释放变量的内存空间并将其销毁。它接受一个或多个变量作为参数,将这些变量的值设为NULL,并从内存中删除对应的变量。使用unset()
函数后,变量将不再可用,无法访问其值和属性。
- PHP是一种开源的服务器端脚本语言,用于开发动态网页和Web应用程序。它的优点包括易于学习和使用、广泛的应用范围、与多个数据库兼容、强大的文本处理和图像处理能力等。
面向对象编程(OOP)是一种编程范式,将数据和操作封装在对象中,通过定义类和创建实例来实现。面向过程编程(POP)则是一种基于过程的编程方式,强调程序的执行过程和函数的调用。相比于POP,OOP更加灵活、可扩展和易于维护。
在PHP中,可以使用
fopen
函数打开文件,并使用fread
函数读取文件内容,或使用fwrite
函数向文件中写入内容。读取文件可以使用fgets
逐行读取,或使用file_get_contents
一次性读取整个文件。写入文件可以使用fwrite
逐块写入,或使用file_put_contents
一次性写入。
超全局变量是在PHP中预定义的全局变量,可以在程序的任何地方访问。常用的超全局变量有 $_GET、$_POST、$_COOKIE、$_SESSION 和 $_SERVER 等,用于获取GET、POST、Cookie、Session和服务器等相关的信息。
设置PHP的报错级别并返回当前级别。
1、header("Location: target_page.php");
2、echo '';
3、echo '';
4、echo '点击跳转';
htmlspecialchars或者htmlentities
- 使用strrev函数进行反转:
$str = "Hello World!"; $reversedStr = strrev($str); echo $reversedStr; // 输出:!dlroW olleH
使用for循环逆序遍历字符串:
$str = "Hello World!"; $length = strlen($str); $reversedStr = ""; for ($i = $length - 1; $i >= 0; $i--) { $reversedStr .= $str[$i]; } echo $reversedStr; // 输出:!dlroW olleH
使用str_split和implode函数进行反转:
$str = "Hello World!"; $characters = str_split($str); $reversedCharacters = array_reverse($characters); $reversedStr = implode("", $reversedCharacters); echo $reversedStr; // 输出:!dlroW olleH
使用递归进行反转:
function reverseString($str) { if (strlen($str) <= 1) { return $str; } else { return reverseString(substr($str, 1)) . $str[0]; } } $str = "Hello World!"; $reversedStr = reverseString($str); echo $reversedStr; // 输出:!dlroW olleH
1、Notice:这些都是一些非常正常的信息,而非重大错误,甚至有一些都不会展示给用户。
2、Warning:这类是稍微严重一些的错误,错误会展示给用户,但不影响程序的输出。
3、Fatal errors:这些是非常严重的错误,比如要访问一个不存在的PHP类。
- 角色(Role):定义用户的角色,每个角色代表一组具有相似权限的用户。例如,管理员、编辑员、普通用户等。
- 权限(Permission):定义系统中的权限,每个权限代表系统中的一项操作或资源。例如,创建、编辑、删除等权限。
- 用户(User):每个用户被分配一个或多个角色,角色决定了用户所拥有的权限。
- 角色与权限的关系:每个角色与多个权限相关联,一个角色可以拥有多个权限。 基于上述基本概念,可以实现RBAC的具体流程如下:
- 创建角色和权限:定义系统中需要的角色和权限,例如创建一个管理员角色和相应的管理权限。
- 分配权限给角色:将权限分配给角色,确定每个角色所拥有的权限。例如,将管理员角色分配创建、编辑、删除等权限。
- 创建用户并分配角色:创建系统用户,并将相应的角色分配给用户。例如,创建一个用户,并将管理员角色分配给该用户。
- 权限检查:在系统中的操作或资源需要权限控制时,检查用户所拥有的角色和相应的权限,判断用户是否有权进行相应操作。
在PHP中,可以通过以下几种方式实现静态化: 静态HTML文件保存:将动态生成的页面保存为静态HTML文件,然后在需要访问该页面时直接读取静态文件进行展示。这种方式适用于内容不经常变化的页面,可以减轻服务器负载和提高网页加载速度。 缓存机制:使用缓存技术来存储动态生成的页面内容,下次访问时直接从缓存中获取,并根据一定的规则判断是否需要重新生成页面内容。常见的缓存技术包括Memcached、Redis等。 HTTP缓存控制:通过设置HTTP响应头,指定页面的过期时间、缓存标识等,使浏览器或者代理服务器在一定时间内缓存页面内容。这样可以减少对服务器的请求,提高页面加载速度。 模板引擎:使用模板引擎来分离页面的静态部分和动态部分,将动态数据填充到模板中生成最终的HTML页面。常见的模板引擎有Smarty、Twig等。 静态文件服务器:将动态生成的页面或者静态资源(如图片、CSS、JavaScript等)存储在专门的静态文件服务器上,由静态文件服务器直接响应请求,减轻动态服务器的负载。 以上方法可以单独使用,也可以结合使用,根据实际需求和场景选择合适的方式来实现静态化。静态化可以提高网站的性能和用户体验,减少服务器压力,但需要注意动态内容的更新和缓存的过期策略,避免过期内容的展示。