PHP项目从 php5.3 版本升级到 php8.3 版本时的一些问题和解决方法记录

news2024/12/16 1:13:39

        一个原来的项目,因为业务需要,进行了PHP版本升级,从php5.3直接升级到php8.3。变化挺大的,原程序中有很多不再兼容,在此处进行一下记录。

一、Deprecated: 显式转换问题

        报错内容:Deprecated: Implicit conversion from float 173387987633874.1 to int loses precision in

        之前运行正常的一段代码(印象中还是原百度公司中生成日志的一个方法),切换PHP环境从5.3至8.3时报了些错误,因为是很久前的代码了,我就简单看了一下并作一下记录。

    private function __initLogID()
    {

		if(defined('LOG_ID')) return LOG_ID;
		
		$arr = gettimeofday();
		
		$t = ($arr['sec']*100000 + $arr['usec']/10) & 0x7FFFFFFF;

		define('LOG_ID', $t);

		return LOG_ID;

	}

        这个PHP警告是关于隐式转换的。在PHP 7及以上版本中,当将一个浮点数(float)转换为整数时,如果不显式指定转换类型,PHP会进行截断操作,即直接去掉小数点后的数字,而不是四舍五入。如果转换后的整数超出了整数的表示范围,PHP会发出一个警告信息。

        报错中的数字173387987633874.1被隐式转换成了173387987633874,这个数字在转换过程中没有超出整数的范围,但在后续的代码中可能会导致不正确的行为。

        所以解决方法就是:进行显式转换类型:使用intval()或(int)来进行强制转换,并指定正确的进制,如下即可。

$t = intval($arr['sec']*100000 + $arr['usec']/10) & 0x7FFFFFFF;

二、Deprecated: 动态属性问题

        Deprecated: Creation of dynamic property XXXController::$xxx is deprecated in

        底层程序框架中有很多地方使用了动态属性的设置,这是PHP的一个很好用的功能。动态属性是 PHP 元编程的重要组成部分——许多框架都依赖它!

	/***********************************
			全局核心设置方法
	 ***********************************/
	 
	public function __set($key, $value)
    {
		
		$this->$key=$value;
	
	}

        不过版本升级以后,发现在 PHP 8.2对这个进行了弃用。特别是弃用了这个动态属性。什么是动态属性?就是直接给类定义不存在的属性,但在运行时动态设置在这些类的对象上。自 PHP 8.2 起,这个动态属性被弃用。

        不过呢,也不要气馁。对类进行 __get并且__set仍然有效!所以呢,不用担心。增加一些方法,可以使这个新的弃用不会影响任何实现__get 和类 __set。

class Test
{
    private array $properties = [];
    
    public function __set(string $name, mixed $value)
    {
        $this->properties[$name] = $value;
    }

}

        当然,此处进行了修改之后,也需要对 __get 进行适应的修改,才能正常运行。代码我就不贴了,一看就懂。

三、Deprecated: key方法过时

        报错内容:Deprecated: key(): Calling key() on an object is deprecated

        在PHP中,当你尝试使用key()函数来获取数组中当前元素的键名,但是你传递给key()的参数是一个对象时,会触发这个已废弃(deprecated)的警告。从PHP 7.2开始,调用key()在对象上是不支持的,并且会引发此类警告。

    public static function __getSlientDB()
    {

        //原方法
        //return key(self::$__config);

        //使用如下方法替代
        return current(array_keys(get_object_vars(self::$__config)));

    }

        在PHP 8中,可使用get_object_vars函数来获取对象的所有属性。这个函数返回一个数组,包含对象中所有可访问的属性和它们的值。上面就可以使用此方法替换已过期的 key 方法。

三、Fatal error

        Fatal error: Uncaught TypeError: Attribute value must be of type int for selected attribute, string given 代码如下:

    private static $errmode='PDO::ERRMODE_WARNING';
	
    private function initDb()
    {
        
        $this->initTime();

		$db = new PDO(self::$db_dsn, self::$db_username, self::$db_password, self::$db_dotype);

		$db->query(self::$db_querychar);

        // 此处的 PDO::ERRMODE_WARNING 原为设置的$errmode属性值,用的字符串形式
        // 修改为直接使用 PDO::ERRMODE_WARNING,也可将第一行属性去除引号即可
		$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

        KeDebug::dblog("Link Database {$this->__dbResourceName}.", $this->calculateTime(), $this->__dbResourceName);
		
		return $db;
    
    }

        PDO::ERRMODE_WARNING 原为设置的一个属性值,用的字符串形式。在原版本中都能正常,升级后的 php8中,报语法错误类型不对,因此直接使用 。

四、call_user_func_array问题

        php8  call_user_func_array Uncaught Error: Unknown named parameterParse error:

        原框架在调用  call_user_func_array 的时候传递的 数组参数能正常运行,但在php8.3 中,发现会报错,推测是要求函数中必须要有相关的参数定义,于是在 call_user_func_array 调用的方法上加上了与后面传递的数组参数相同名称的参数名,错误就解决了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Liunx中安装JDK、Tomcat、mysql、lrzsz、Nginx

一.软件安装方式 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 二.安装JDK 上述我们介绍了Linux系统软件安装的四种形式,接下来我们就通过第一种(二进制发 布包)形式来安装JDK。 在/下创建soft目录&…

LeetCode-hot100-73

https://leetcode.cn/problems/largest-rectangle-in-histogram/description/?envTypestudy-plan-v2&envIdtop-100-liked 84. 柱状图中最大的矩形 已解答 困难 相关标签 相关企业 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#x…

leetcode-73.矩阵置零-day5

class Solution {public void setZeroes(int[][] mat) {int m mat.length, n mat[0].length;// 1. 扫描「首行」和「首列」记录「首行」和「首列」是否该被置零boolean r0 false, c0 false;for (int i 0; i < m; i) {if (mat[i][0] 0) {r0 true;break;}}for (int j …

【Spark】Spark Join类型及Join实现方式

如果觉得这篇文章对您有帮助&#xff0c;别忘了点赞、分享或关注哦&#xff01;您的一点小小支持&#xff0c;不仅能帮助更多人找到有价值的内容&#xff0c;还能鼓励我持续分享更多精彩的技术文章。感谢您的支持&#xff0c;让我们一起在技术的世界中不断进步&#xff01; Sp…

开源 AI 智能名片 S2B2C 商城小程序对私域流量运营的全方位助力

在当今竞争激烈的商业环境中&#xff0c;私域流量运营已成为企业实现可持续发展和提升竞争力的关键策略之一。开源 AI 智能名片 S2B2C 商城小程序凭借其独特的功能与特性&#xff0c;从多个维度为私域流量运营提供了强有力的支持与推动&#xff0c;以下将详细阐述其在各个方面的…

【razor】echo搭配relay功能分析

echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…

Phoenix5.1.3安装

环境说明 准备三台服务器&#xff0c;分别为&#xff1a;bigdata141&#xff08;作为HBase主节点&#xff09;、bigdata142、bigdata143&#xff0c;已经搭建好HBase集群&#xff0c;我这边HBase版本为2.2.7另准备一台服务器&#xff0c;bigdata144&#xff0c;作为Phoenix客户…

ASP.NET Core API + MySql

环境 数据库&#xff1a; mysql8.0 后端&#xff1a; vs2022 ASP.NET Core API .net 8 前端&#xff1a; Hbuilderx bootstrap 5.3.0 jquery v3.7.1 bootstrap-table 1.23.5 创建项目 添加资源包 AutoMapper Microsoft.EntityFrameworkCore.Tools 8.0.0 Pomelo.EntityFramew…

小程序维护外包流程和费用

由于某些原因很多老板想要跟换掉小程序原来合作的开发公司&#xff0c;重新把小程序系统维护外包新的公司。小程序系统外包维护是一个涉及多个方面的过程&#xff0c;需要从需求明确、选择团队到持续优化等多个环节进行细致管理。以下就是小程序系统外包维护主要包括几个关键步…

代码随想录算法训练营第三十二天|动态规划理论基础|LC509.肥波那些数|LC70.爬楼梯|LC746.使用最小花费爬楼梯

动态规划理论基础 解释&#xff1a;动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff1b;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 动态规划五部曲&#xff1a; 1、确定dp数组&#xff08;dp table&#xff09;…

亮相AICon,火山引擎边缘云揭秘边缘AI Agent探索与实践

12月13-14日&#xff0c;AICon 全球人工智能开发与应用大会在北京成功举办。火山引擎边缘智能技术负责人谢皓受邀出席大会&#xff0c;以《AI Agent 在边缘云的探索与实践》为主题&#xff0c;与全球 AI 领域的资深专家&#xff0c;共同深入探讨大模型落地、具身智能、多模态大…

找出1000以内的所有回文数

找出1000以内的所有回文数 方法概述检查回文数的方法伪代码C代码实现代码解析运行结果在计算机科学中,回文数是一种具有对称性质的数,即从左向右读和从右向左读都是相同的。例如,121、1331、12321都是回文数。本文将利用数据结构、C语言和算法的知识来编写一个程序,找出100…

数据保护策略:如何保障重要信息的安全

一、什么是数据安全&#xff1f; 数据安全是保护数字信息免遭盗窃、未经授权的访问和恶意修改的过程。这是一个持续的过程&#xff0c;负责监督信息的收集、存储和传输。 机密性&#xff1a;保护数据免遭未授权方访问。 完整性&#xff1a;保护数据免遭未经授权的修改、损坏…

SpringBoot【八】mybatis-plus条件构造器使用手册!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 经过上一期的mybatis-plus 入门教学&#xff0c;想必大家对它不是非常陌生了吧&#xff0c;这期呢&#xff0c;我主要是围绕以下几点展开&#xff0c;重点给大家介绍 里…

基于springboot+vue的高校校园交友交流平台设计和实现

文章目录 系统功能部分实现截图 前台模块实现管理员模块实现 项目相关文件架构设计 MVC的设计模式基于B/S的架构技术栈 具体功能模块设计系统需求分析 可行性分析 系统测试为什么我&#xff1f; 关于我项目开发案例我自己的网站 源码获取&#xff1a; 系统功能 校园交友平台…

33.攻防世界upload1

进入场景 看看让上传什么类型的文件 传个木马 把txt后缀改为png 在bp里把png改为php 上传成功 用蚁剑连接 在里面找flag 得到

基于Python+Sqlite3实现的搜索和推荐系统

基于Python实现的搜索和推荐系统 一、引言 伴随着科技的不断进步&#xff0c;互联网&#xff0c;万维网的不断发展。我们越来越热爱万维网&#xff0c;也欣赏他的发展方式。20世纪90年代初&#xff0c;万维网还只是一个将文档联系起来的简单网络。如今&#xff0c;他已经成为…

使用idea创建一个JAVA WEB项目

文章目录 1. javaweb项目简介2. 创建2.1 idea新建项目2.2 选择&#xff0c;命名2.3 打开2.4 选择tomcat运行2.5 结果 3. 总结 1. javaweb项目简介 JavaWeb项目是一种基于Java技术的Web应用程序&#xff0c;主要用于开发动态网页和Web服务。这种项目能够构建在Java技术栈之上&a…

【潜意识Java】Java基础教程:从零开始的学习之旅

目录 1. Java 简介 2. Java 程序结构 2.1 包声明&#xff08;Package Declaration&#xff09; 2.2 导入语句&#xff08;Import Statement&#xff09; 2.3 类声明&#xff08;Class Declaration&#xff09; 2.4 main 方法&#xff08;Main Method&#xff09; 3. Jav…

算法题(2):三步问题

审题&#xff1a;需要输出小孩上楼梯的方式的数量&#xff08;需要取模&#xff09; 思路&#xff1a; 如果正面来思考这个问题会无从下手&#xff0c;因为我们的分类太多了&#xff0c;没有办法把大问题缩小。 但是如果反过来思考&#xff0c;小孩最后一步有几种情况&#xff…