假设我正在创建一个会话类,其相关实现如下:
public class Session()
{
private $id;
private $user;
}
如果会话已登录,则$user
字段包含User类型的对象,如果会话未登录到站点,则为null。 $id
是会话ID。
假设我现在想知道用户是否已登录。显然我可以查看$ user是否为null,如果是则用户未登录 - 如下所示:
public class Session()
{
private $id;
private $user;
public function isLoggedIn()
{
return !is_null($user);
}
}
或者,我可以存储一个布尔会话变量$loggedIn
或其他东西,在登录时设置为false,否则在构造函数中初始化为false,以反而测试:
public class Session()
{
private $id;
private $user;
private $loggedIn;
public function isLoggedIn()
{
return $loggedIn;
}
}
一种方法会比另一种方法产生更好的性能吗?如果是这样,哪个,为什么?或者,出于与绩效无关的任何原因,一种方法是否优于另一种方法?
答案 0 :(得分:10)
在此用户提供的帖子(link to post)上检查php.net
基准,我们发现==
和===
比is_null
快得多。
答案 1 :(得分:6)
越简单越好。如果引入一个新变量来跟踪$ user是否为null,那么您还会引入is_null($ user)和$ loggedIn不匹配的可能性。避免担心这一点的麻烦比任何可能的性能微观优化都要值得多。
答案 2 :(得分:3)
我想说最好的办法是:
return ($user !== null)
答案 3 :(得分:1)
最快的方法是isset()
:
public function isLoggedIn() {
return isset($this->user);
}
如果变量设置(存在)且不是isset()
,则TRUE
函数返回NULL
,否则返回FALSE
。
它比!is_null()
和!empty()
快得多,并且比!== NULL
略快,当值为NULL
时,以及它不是{{1}时}}
答案 4 :(得分:0)
您实际上可以使用cast to bool解决问题:
public function isLoggedIn()
{
return (bool) $this->user;
}
PHP中的每个对象都是TRUE
,而NULL
是FALSE
。
你原来的问题"什么是更快"通常不起任何重要作用。更重要的是,您可以轻松阅读您的代码,其中包括不编写不必要的代码,尤其不是,因为您猜测月亮处于特定阶段时可能会更快。
你不知道两件重要的事情:我的代码太慢了吗?哪一个更快?如果你根本无法回答第一个问题,那么就不要考虑问第二个问题。
你只是在脑中放入一些你永远不会使用的东西。那是a common mistake inexperienced programmers do,所以越早停下来,你就越快获得可以使用的结果。从一开始就保持代码越容易,就越容易运行。而那些你遇到的问题对你来说不会成为问题,因为没有太多的改变来消除性能损失。听起来很公平吗?