php错误提示:Call-time pass-by-reference has been deprecated
在函数调用时参数被按照引用传递时是否发出警告。此方法已不被赞成并在 PHP/Zend 未来的版本中很可能不再支持。鼓励使用的方法是在函数定义中指定哪些参数应该用引用传递。鼓励大家尝试关闭此选项并确保脚本能够正常运行,以确保该脚本也能在未来的版本中运行(每次使用此特性都会收到一条警告)。
在函数调用时通过引用传递参数是不推荐的,因为它影响到了代码的整洁。如果函数的参数没有声明作为引用传递,函数可以通过未写入文档的方法修改其参数。要避免其副作用,最好仅在函数声明时指定那个参数需要通过引用传递。
参见引用的解释。
版本 | 说明 |
---|---|
5.4.0 | 从 PHP 中移除。 |
5.3.0 | Emits an E_DEPRECATED level error. |
5.0.0 | Deprecated, and generates an E_COMPILE_WARNING level error. |
************************************************************************************************************************************************************************************
PHP在升级到5.4版本的php可能会出现这种错误:
如果这样使用函数(或者类)的话,会产生一个 PHP Fatal error:
foo(&$var);
实际上,这样用法在php5.3中就会有提示,只是之前的仅仅会提示Deprecated而已。
[html] view plain copy
- // 正确写法
- function myFunc(&$arg) { do something... }
- myFunc($var);//Call myFunc
- //错误写法
- function myFunc($arg) { do something... }
- myFunc(&$arg);//Call myFunc
************************************************************************************************************************************************************************************
意思是调用时引用传参已经被移除了,就是不能通过function(&$a)这种方式传参调用函数. 解决方案: 查看你的php.ini配置文件,把其中的 allow_call_time_pass_reference参数调整为true,并重启服务器试试。 ====================================== 此外,以前的php代码在升级到5.4版本的php可能会出现这种错误: 当我们这样使用函数(或者类)的话,会产生一个error: foo(&$var); 实际上,这样用本来就是错的,只是之前的错误级别仅仅是Deprecated而已。 而正确的使用方法应该是在函数定义时: function foo(& $var) { //other code } 而在调用时直接传参就行了: foo($var);
今天在写引用时突然出现了Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of getimagesize(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer错误,后来才知道原因是此方法已不被赞成并在 PHP/Zend 未来的版本中很可能不再支持了
解决办法
第一种方法、 把php.ini的display_errors = on改成display_errors = off (不显示错误)
第二种方法、allow_call_time_pass_reference = Off 变成 allow_call_time_pass_reference = On
出错行:
- $errorCode = $action->login($uid, $pass, &$user);
login方法的定义:
- class XXXXXXX {
- public function login($userName, $userPass, &$user = NULL){
- //......
- }
- }
按引用传参,其实只用在定义时指定“&”即可,调用时不用写,只不过一直以来都这么写也没报过错,看来是5.4版增强了检查,不允许这种调用了。
调用时去掉“&”,只保留方法定义中的“&”,这次一切OK了。
===============================================================================
PHP升级到5.5+后MySQL函数及其Mysqli函数代替用法
由于MySQL扩展从php 5.5开始弃用,所以以后不推荐大家再用MySQL扩展,请用MySQLi或PDO代替,以下是MySQL对应的MySQLi函数(绿色字体)供大家参考。(注:PHP手册上的有误,这里是最准的)
MySQL>>(从PHP 5.5开始弃用)
mysql_affected_rows — (mysqli_affected_rows())取得前一次 MySQL 操作所影响的记录行数
mysql_client_encoding — (mysqli_character_set_name())返回字符集的名称(返回当前连接的默认字符集名称。)
mysql_close — (mysqli_close())关闭 MySQL 连接
mysql_connect — (mysqli_connect())打开一个到 MySQL 服务器的连接
mysql_create_db — (mysqli_query() then CREATE DATABASE)新建一个 MySQL 数据库(废弃)(用 mysql_query() 来提交一条 SQL 的 CREATE DATABASE 语句来代替)
mysql_data_seek — (mysqli_data_seek())移动内部结果的指针
mysql_db_name — (Query: SELECT DATABASE()非全等)取得 mysql_list_dbs() 调用所返回的数据库名
mysql_db_query — (mysqli_select_db() then the mysqli_query())选择一个数据库并在它上面执行一个查询 从 PHP 5.3.0 起弃用 用 mysql_select_db() 和 mysql_query() 代替
mysql_drop_db — (Execute a DROP DATABASE query)丢弃(删除)一个 MySQL 数据库(废弃)(用 mysql_query() 提交一条 SQL DROP DATABASE 语句来替代)
mysql_errno — (mysqli_errno())返回上一个 MySQL 操作中的错误信息的数字编码
mysql_error — (mysqli_error())返回上一个 MySQL 操作产生的文本错误信息
mysql_escape_string — (mysqli_escape_string())转义一个字符串用于mysql_query从PHP 5.3.0起弃用用 mysql_real_escape_string() 代替
mysql_fetch_array — (mysqli_fetch_array())从结果集中取得一行作为关联数组,或数字数组,或二者兼有
mysql_fetch_assoc — (mysqli_fetch_assoc())从结果集中取得一行作为关联数组
mysql_fetch_field — (mysqli_fetch_field())从结果集中取得列信息并作为对象返回
mysql_fetch_lengths — (mysqli_fetch_lengths())取得结果集中每个输出的长度
mysql_fetch_object — (mysqli_fetch_object())从结果集中取得一行作为对象
mysql_fetch_row — (mysqli_fetch_row())从结果集中取得一行作为枚举数组
mysql_field_flags — (mysqli_fetch_fields() [flags]?)从结果中取得和指定字段关联的标志
mysql_field_len — (mysqli_fetch_field_direct() [length])返回指定字段的长度
mysql_field_name — (mysqli_fetch_field_direct() [name] or [orgname])取得结果中指定字段的字段名
mysql_field_seek — (mysqli_field_seek())将结果集中的指针设定为指定的字段偏移量
mysql_field_table — (mysqli_fetch_field_direct() [table] or [orgtable])取得指定字段所在的表名
mysql_field_type — (mysqli_fetch_field_direct() [type])取得结果集中指定字段的类型
mysql_free_result — (mysqli_free_result())释放结果内存
mysql_get_client_info — (mysqli_get_client_info())取得 MySQL 客户端信息
mysql_get_host_info — (mysqli_get_host_info())取得 MySQL 主机信息
mysql_get_proto_info — (mysqli_get_proto_info())取得 MySQL 协议信息
mysql_get_server_info — (mysqli_get_server_info())取得 MySQL 服务器信息
mysql_info — (mysqli_info())取得最近一条查询的信息
mysql_insert_id — (mysqli_insert_id())取得上一步 INSERT 操作产生的 ID(得到在最后一次查询生成的id)
mysql_list_dbs — (SQL Query: SHOW DATABASES)列出 MySQL 服务器中所有可用的数据库(从php5.4.0弃用)(用SQL 查询: SHOW DATABASES代替)
mysql_list_fields — (SQL Query: SHOW COLUMNS FROM sometable)列出 MySQL 表字段(取得给定表名的信息)(弃用)(已过时。最好用 mysql_query() 来发出一条 SHOW COLUMNS FROM table [LIKE 'name'] 的 SQL 语句来代替。)
mysql_list_processes — (mysqli_thread_id()不全等)列出 MySQL 进程
mysql_list_tables —(SQL Query: SHOW TABLES FROM db_name) 列出 MySQL 数据库中的表(弃用)(已弃用。 使用 mysql_query() 发出一个SQL SHOW TABLES [FROM db_name] [LIKE 'pattern']语句代替. )
mysql_num_fields — (mysqli_field_count())取得结果集中字段的数目
mysql_num_rows — (mysqli_num_rows(),mysqli_stmt_num_rows())取得结果集中行的数目
mysql_pconnect — (mysqli_connect() with p: host prefix)打开一个到 MySQL 服务器的持久连接
mysql_ping — (mysqli_ping())Ping 一个服务器连接,如果没有连接则重新连接
mysql_query — (mysqli_query())发送一条 MySQL 查询
mysql_real_escape_string — (mysqli_real_escape_string())转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集
mysql_result — (mysqli_data_seek() 联合 mysqli_field_seek() and mysqli_fetch_field())取得结果数据
mysql_select_db — (mysqli_select_db())选择 MySQL 数据库
mysql_set_charset — (mysqli_set_charset())设置客户端字符集
mysql_stat — (mysqli_stat())取得当前系统状态
mysql_tablename — (SQL Query: SHOW TABLES)取得表名(取得字段的表名)(弃用)(已弃用。 使用 mysql_query() 发出一个 SQL SHOW TABLES [FROM db_name] [LIKE 'pattern'] 语句代替. )
mysql_thread_id — (mysqli_thread_id())返回当前线程的 ID
mysql_unbuffered_query — (mysqli_query(“SQL语句”, MYSQLI_USE_RESULT); )向 MySQL 发送一条 SQL 查询,并不获取和缓存结果的行