了解 PHP 分配
Posted
技术标签:
【中文标题】了解 PHP 分配【英文标题】:Understanding PHP assignments 【发布时间】:2014-03-04 08:20:14 【问题描述】:我在试图理解目前可能在我之上的某些代码行背后的想法时遇到了一些问题,因为我相当确定它们与 OOP (我不太了解的东西)有关刚从 OOP 背后的概念开始)这是我在阅读 php 书籍时想到的。代码如下。
$mysqli = new mysqli('example','example','example');
if(!$mysqli)
die("Could not connect".mysql_error());
else
echo("Connection established");
if($mysqli->query("CREATE DATABASE querycreation1")===TRUE)
echo"<p>Database Querycreation1 created</p>";
else
echo "Error creating database".mysql_error();
我理解前几行(并感谢有关最佳实践的意见),但我遇到问题的部分是在下一组 if-else 语句之后。 第二个 if 语句检查数据库的创建是否属实,但是有人可以解释数据库的确切创建时间吗?我需要创建一个然后在将来检查它吗?任何意见将不胜感激。
【问题讨论】:
在您使用 mysqli 时代码中有错误,并且有函数mysql_error
会出错。也许你没有正确检查代码。
不严格!第二个执行 CREATE DATABASE
语句,然后测试该语句是否成功执行
@BrokenHeartღ 代码检查出来,没有错误,如果您尝试按原样运行它并且很可能出现错误,因为我将第一条语句更改为'example','example', '例子' :)
有些人喜欢先执行查询,然后在单独的行中检查它的结果。正如您自己所看到的那样,使其更具可读性。
【参考方案1】:
在 PHP 的比较中,首先计算所有表达式。这意味着在
if($mysqli->query("CREATE DATABASE querycreation1")===TRUE)
PHP 将首先在 $mysql-object 上运行 query() 函数。该函数返回一个结果。在成功创建数据库的情况下,它将返回 TRUE (http://nl1.php.net/mysqli_query)。然后将调用此函数的结果 (TRUE) 与 TRUE 进行比较。
也许你看到这个更详细:
$databaseCreated = $mysqli->query("CREATE DATABASE querycreation1");
if($databaseCreated ===TRUE)
echo"<p>Database Querycreation1 created</p>";
else
echo "Error creating database".mysql_error();
【讨论】:
这正是我要找的东西!!。我对它的工作原理有一个模糊的想法,你很好地证实了它。现在,为了将来参考,你会说最好写吗以更详细的方式? 在这种情况下,我会选择更冗长的,它让我更少困惑...... :)【参考方案2】:$mysqli->query()
执行查询,在本例中为 CREATE
查询。如果查询成功执行,则该函数返回TRUE
,如果发生错误,则返回FALSE
。因此,数据库是在评估 ===
比较的第一个参数时创建的。
一般来说,在php
脚本中创建数据库的情况不会经常发生,通常只在“安装”脚本中用于设置一些php
驱动的软件(例如讨论板/论坛)。除此之外,您需要通过数据库管理系统(如phpMyAdmin
)或之后删除的脚本创建一次数据库。然后在您的实际站点脚本中,您只需假设数据库存在,因为您通常也不只是删除它们。
您可以通过将查询的返回值分配给一个变量并对其进行检查来以不同的方式编写它:
$success = $mysqli->query("CREATE DATABASE querycreation1");
if ($success===TRUE)
// ...
但这纯粹是一个偏好问题。
此外,由于die
语句,第一个 else 并不是绝对必要的。您可以通过多种方式简化(或者说修改)该部分:
// The "just no else" version
if (!$mysqli)
die("Could not connect".mysql_error());
echo("Connection established");
// The one-liner version
if (!$mysqli) die("Could not connect".mysql_error());
echo("Connection established");
// The short-circuit version
$mysqli OR die("Could not connect".mysql_error());
echo("Connection established");
// same using the symbolic version of OR
$mysqli || die("Could not connect".mysql_error());
echo("Connection established");
// you can also include that in the first call
$mysqli = new mysqli('example','example','example') OR die("Could not connect".mysql_error());
echo("Connection established");
最后三个例子的工作基于php
以短路方式处理逻辑运算符,即如果第一部分是TRUE
,那么整个OR
表达式将是TRUE
不管第二个参数是什么,所以php
甚至都懒得去评估它。但是,如果第一部分是 FALSE
,则表达式的值取决于第二个参数,因此会对其进行计算。
【讨论】:
谢谢,我对这应该如何工作有一个模糊的想法。我很好奇,因为我刚刚开始,还有其他语言可以做这样的事情吗?这种作业评估的技术名称是什么? 我不确定它是否有技术名称,但内部发生的事情是直接使用返回值,而不是先将其分配给变量。这消除了以后访问该值的可能性,但节省了内存,因为它不是永久存储的。大多数语言都可以做到这一点。 很高兴知道。我从你的帖子中学到了很多。我注意到的一件事是关于 php 如何处理逻辑运算符的解释。我猜它的短路方式(php ) 评估操作者如果不注意可能会带来很多问题。我会记住这一点。 这主要是因为有些人(包括我自己)喜欢以我最后 3 个示例的方式使用这种行为。如果你不知道短路行为,阅读这样写的代码会让你很困惑。【参考方案3】:第一点: 您正在创建一个类 mysqli 的实例,其中包含连接、查询、管理数据库的方法。您需要传递一些参数,这些参数被类的构造函数用来连接到数据库。
这个实例被称为一个对象,现在这个对象有了连接并且可以使用类中的方法来查询、管理那个数据库。
为了更好的理解:http://www.php.net/manual/en/language.oop5.php
【讨论】:
我认为一个类的实例是一个对象?你会说对象和类的实例有什么区别? 只是引用上面的答案:“这个实例被称为一个对象” 你在说“你不是在创建一个对象,你是在创建一个叫做对象的东西。” @scenia 不,我相信他是个新手。所以,我试图解释他,一个类的实例被称为一个对象 是的,但是您在那里写的第一件事是“您没有创建对象”。然后你解释他正在创造什么并继续告诉他这被称为一个对象。这是一个矛盾,我之前的评论减少了你的帖子以表明这一点。要检查自己,请将以an instance
到database
开头的整个说明替换为something
,然后将This instance ...
替换为which ...
。你会从上面得到我的报价。以上是关于了解 PHP 分配的主要内容,如果未能解决你的问题,请参考以下文章