PHP编程遇到过的细节问题(总结)

2023-02-17 13:52:55 浏览数 (1)

记录

1. 网络地址监听

习惯本地开发调试了,忘记了127.0.0.1只能是本地,监听所有IP要监听 0.0.0.0。

2. use语句

use语句只在它所声明的物理文件内有效,use定义别名之后,无法使用之前的名字。

  • use,给命名空间定义一个别名,用于简化复杂的命名空间调用。use abc as d,调用d下面的类、函数、常量等成员时  dson();
  • use,从命名空间引入类,引入后可直接使用,不需要前缀(引入时可以定义别名)。use abc as d,使用该类时  new d();
  • use,从命名空间引入函数,引入后可直接使用,不需要前缀(引入时可以定义别名)。use function abc as d,使用该函数时  d();
  • use,从命名空间引入常量,引入后可直接使用,不需要前缀(引入时可以定义别名)。use const abc as d,使用该常量时  d;

3. 向数据库Mysql写入html

向数据库Mysql写入html语句时被自动转义,原来是自己转义写入,取出后转义回去,发现转义回不去了。调试了一下发现写入时转了两次,现在还没找到原因。

4. include和require

使用include和require时,相对路径是以运行的脚本所在的路径作为标准,文件之间嵌套的include都以运行脚本所在的目录作为标准。a 包括 b,b 包括 c ,b是相对a所在的目录包括c。在PHP中不能以 “/”代表绝对路径(应该是要进行相关设置之后才可以,例如php.ini里的include_path),正常情况下可以使用超全局变量 $_SERVER["DOCUMENT_ROOT"]代表根目录路径。

5. 多文件上传

多文件同时上传(name[],指定name为数组的形式)时全局变量_FILE 的层级为 _FILE[param][tmp_name/name/size][0/1/2/3]。不同的name则直接

6. PHP类成员

PHP类成员必须加修饰符 public/private/protected。__DIR__,这会获取当前脚本所在目录的路径

7. <style>标签

<style>标签支持load事件。可以div内放一个标签实现div的加载事件。

8. 正则匹配

正则匹配时当“.”在“[ ]”内时代表标点符号,不需要转义,其它元字符则需要转义。非贪婪匹配 (.*?)

9. intdiv()

PHP7引入了intdiv()的新函数,它执行操作数的整数除法并返回结果为 int 类型。inidiv(10,3)等于3;

10. Tp6

开发模式下经常用的配置可以放在'.env'目录下,有了.env 文件,不用每次去改config里的配置,.env用在开发过程中模拟环境变量配置(官方建议该文件在服务器部署的时候忽略),删除.env,如果 .env 还有其他配置项,就意味着你还会丢失配置项,一般不建议这样做,只是在 .env 中关闭调试即可。实测.env在调试模式开启、关闭下都可以获取值。

11. 循环使用多条件

PHP的for循环使用多条件时,跟IF中的语法是一致的,如for($k=$pagenum-2;$k>=-1 && $k<$pagenum && $k>($pagenum-3);$k ),多变量的多条件则用逗号分隔分别进行定义。

12. 下级目录操作上级目录文件

下级目录的PHP文件操作上级目录文件时会受到php.ini、目录内的.user.ini 的open_basedir配置项所指定的路径限制;

13. Nginx不支持中文目录

Nginx不支持中文目录解决办法,首先将xftp之类的软件的传输编码改为UTF-8,在Nginx配置文件内加上Chatset utf-8; 指令,重启Nginx即可;

14. 生产版本和开发版本

PHP生产环境版本指只启用了部分拓展,而开发环境版本则启用了所有可以加载的拓展。

15. 一些可能比较少见的PHP语法:

类的构造方法没有参数时,实例化类可以省略括号,例如 new A;

(new app())->console->run(); 这是在tp6见到的语法。

箭头函数的基本语法为 fn (argument_list) => expr。(PHP7.4的特性)

代码语言:javascript复制
<?php
$y = 1;
$fn1 = fn($x) => $x   $y;
// 相当于 using $y by value:
$fn2 = function ($x) use ($y) {
    return $x   $y;
};
var_export($fn1(3));

流程控制(包括if、for、foreach、while、swich)等语句的替代语句,左花括号换成冒号(:),右花括号换成(endif、endfor等)。

代码语言:javascript复制
if  (a > b):
    echo "this";
end if

$fp=fopen($file_path,"r") or die("文件不存在!");

16. 错误日志

error_log =/usr/local/error.log,配置项内开启PHP错误日志记录,Thinkphp会自动记录错误日志。

17. php正则

php正则可以自定义开头和结尾标识符的。/w/、#w#、@w@是等价的,在正则中匹配反斜杠需要四个\\,才能匹配(\也可以,但是官方说要四个);讲道理,php单引号内不换进行转义使用\应该也可以,但事实并非如此。在java内元字符前面 \s ,都是两个杠,字符串转义 \之后是一个斜杠,正则本身也需要转义。所以java匹配需要四个,经过字符串正则两道转义。

18. PHP 通过多进程实现异步操作。

代码语言:javascript复制
<?php
$pid = pcntl_fork();
if ($pid == 0) {
    //子进程
    //模拟发送邮件
    sleep(30);//发送邮件花费30秒
    exit(0);
}

pcntl_waitpid($pid, $status, WNOHANG);
echo "发送邮件中";

相关文章:PHP实用函数记录、PHP实用函数记录2

19. UTF-8 BOM

window记事本编辑过的PHP文件会变成utf8 bom格式 ,每一个bom格式的php文件被加载的时候都会导致输出一个特殊字符。

20. 函数内声明全局变量

代码语言:javascript复制
global $variant;
$variant = 1;

21. namespace

PHP 命名空间可以解决以下两类问题:

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

PHP普通变量和define声明的常量不受namespace的约束,也就是说include文件时,普通变量重复声明时,前一个会被后一个覆盖

22. clone关键字

在 PHP 中可以使用 clone 关键字克隆对象,语法格式如下:

代码语言:javascript复制
克隆对象名称 = clone 原对象名称;

因为 clone 的方式实际上是对整个对象的内存区域进行了一次复制并用新的对象变量指向新的内存,因此赋值后的对象和原对象之间是相互独立的。对象克隆成功后,它们中的成员方法、属性以及值是完全相同的。如果要对克隆后副本的成员属性重新赋值,可以使用PHP魔术方法中的 __clone() 方法。

拓展安装

拓展库:https://pecl.php.net/

1. 安装ssh2

代码语言:javascript复制
pecl install ssh2-1.1

实用函数

1.中文截取

代码语言:javascript复制
<?php

/*
 * 中文截取
 * */
function mb_substr_replace($string, $replacement, $start, $length = null, $encoding = null)
{
    if (extension_loaded('mbstring') === true) {
        $string_length = (is_null($encoding) === true) ? mb_strlen($string) : mb_strlen($string, $encoding);

        if ($start < 0) {
            $start = max(0, $string_length   $start);
        } else if ($start > $string_length) {
            $start = $string_length;
        }

        if ($length < 0) {
            $length = max(0, $string_length - $start   $length);
        } else if ((is_null($length) === true) || ($length > $string_length)) {
            $length = $string_length;
        }

        if (($start   $length) > $string_length) {
            $length = $string_length - $start;
        }

        if (is_null($encoding) === true) {
            return mb_substr($string, 0, $start) . $replacement . mb_substr($string, $start   $length, $string_length - $start - $length);
        }

        return mb_substr($string, 0, $start, $encoding) . $replacement . mb_substr($string, $start   $length, $string_length - $start - $length, $encoding);
    }

    return (is_null($length) === true) ? substr_replace($string, $replacement, $start) : substr_replace($string, $replacement, $start, $length);
}

2. 全局错误捕获

代码语言:javascript复制
<?php

/*
 * 全局错误处理
 * */
set_error_handler(function($errno, $errstr, $errfile, $errline)
{
    file_put_contents('log.txt',$errno.",".$errstr.",".$errfile.",".$errline."n",FILE_APPEND);
    exit();
});


set_exception_handler(function($exception)
{
    file_put_contents('log.txt',$exception->getMessage().','.$exception->getTraceAsString()."n",FILE_APPEND);
    exit();
});

0 人点赞