为啥我们不能直接从函数返回一个 mysqli 对象?对象必须先存储在变量中吗?

Posted

技术标签:

【中文标题】为啥我们不能直接从函数返回一个 mysqli 对象?对象必须先存储在变量中吗?【英文标题】:Why can't we return a mysqli object directly from a function? The object must be stored in a variable first?为什么我们不能直接从函数返回一个 mysqli 对象?对象必须先存储在变量中吗? 【发布时间】:2013-08-08 11:29:12 【问题描述】:

我正在阅读一本关于 php 的书,但对这个示例有疑问:

<?php
function dbConnect() 
    $host = 'localhost';
    $db = 'learnphp';
    $user = 'phplearner';
    $pwd = 'wxyz1234';
    return new mysqli($host, $user, $pwd, $db) or die("Can't open database");

$conn = dbConnect();
$sql = 'SELECT * FROM images';
$result = $conn->query($sql);
$numRows = $result->num_rows;
?>
<p>A total of <?php echo $numRows; ?> records were found.</p>

它不能在我的本地服务器中运行(XAMPP 1.8.1;PHP 5.4.7;mysqlnd 5.0.10 - 20111026;MySQL 5.5.27) - 带有以下错误消息:

致命错误:在非对象上调用成员函数 query() D:\xampp\htdocs\learnphp\mysql\mysqli.php 上线 11

但是,当我更改此行时:

    return new mysqli($host, $user, $pwd, $db) or die("Can't open database");

到:

    $mysqliobj = new mysqli($host, $user, $pwd, $db) or die("Can't open database");
    return $mysqliobj;

正常工作:

一共找到了8条记录。

为什么我不能像示例一样使用return new mysqli(...)?这是 PHP 5.4+ 的新编码要求吗?

【问题讨论】:

【参考方案1】:

[..] or die() 构造与 return 语句一起导致有趣的行为:整个事情被解释为布尔表达式。

因为new mysqli 永远不会为假,所以永远不会处理“die”,因此,您的函数返回 true 而不是新创建的 mysqli 实例。

编辑:

如果您仍想使用or die(),请执行以下操作:

$result = new mysqli($host, $user, $pwd, $db) ;
if (!$result) die ("Can't open database.");
return $result;

【讨论】:

我删除了or die(..),它可以工作了!从示例中,我们应该使用什么来代替or die(..) @weeix 此行为的原因是运算符优先级=or 之前评估,但 return 在两者之后评估。所以$foo = $bar or die()。整个表达式的结果是相同的布尔 true 值,但作为该操作的一部分,$bar 已分配给 $foo,并且没有人关心这里的表达式值。【参考方案2】:

改变这个...

return new mysqli($host, $user, $pwd, $db) or die("Can't open database");

到这个..

return mysqli_connect($host, $user, $pwd, $db) or die("Can't open database");

【讨论】:

我实际上偶然发现了这种错误。我只是退出使用 query() 并继续使用 mysqli_query()。

以上是关于为啥我们不能直接从函数返回一个 mysqli 对象?对象必须先存储在变量中吗?的主要内容,如果未能解决你的问题,请参考以下文章

js 对象中为啥不能直接调用自己的属性方法?

Vue 组件 data为啥是函数

PHP中的MySQLi扩展学习MySQLI_result对象操作

c++中为啥要函数返回引用?

PHP连接数据库

php MySQLi数据库操作 封装类