【发布时间】:2018-11-03 22:31:13
【问题描述】:
所以,
问题
这不是众所周知的,但 PHP 允许比较对象 - 不仅在相等 == 上 - 而且在 < 和 > 上也是如此。但是 - 它是如何工作的?因此,如果我想创建可比较的对象 - 它们应该遵循哪些限制/规则?
最有用的情况是DateTime() 对象 - 它们拥有特定的时间戳,可以进行比较(这具有逻辑意义)。在 lxr 上有一些解释 DateTime 。但是常见的情况呢?
我有:
class C
{
protected $holder;
protected $mirror;
public function __construct($h = null)
{
$this->holder=$h;
$this->mirror=-1*$h;
}
}
$one = new C(1);
$two = new C(2);
//false, false, true: used $holder
var_dump($one>$two, $one==$two, $one<$two);
-如果我要更改属性声明顺序,它将使用$mirror:
class C
{
//only order changed:
protected $mirror;
protected $holder;
public function __construct($h = null)
{
$this->holder=$h;
$this->mirror=-1*$h;
}
}
$one = new C(1);
$two = new C(2);
//true, false, false: used $mirror
var_dump($one>$two, $one==$two, $one<$two);
因此,“规则”之一似乎是它将使用第一个声明的属性。但是我也不清楚为什么要使用 protected 属性。
现在,更复杂的示例:
class Test
{
protected $a;
protected $b;
function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
}
$x = new Test(1, 2);
$y = new Test(1, 3);
// true, false, false
var_dump($x < $y, $x == $y, $x > $y);
$x = new Test(3, 1);
$y = new Test(2, 1);
// false, false, true
var_dump($x < $y, $x == $y, $x > $y);
-所以它将使用 first not-equal 属性进行比较。但上面的代码 sn-ps 只是一些情况。我想确切地知道它是如何发生的以及为什么。因此,
问题
是:它是如何工作的?我的意思是,更详细:
- 我可以相信 PHP 将使用第一个不相等属性进行比较的事实吗?
- 如果属性数量不相等怎么办? (即在代码执行期间,一些属性被动态添加到实例中)
- 我可以将
protected/private属性视为始终计入此类比较吗?
e.t.c. - 所以如果有一些额外的条件/限制/规则会影响结果 - 请张贴。 Documentation 仅用于 ==/=== 比较。此外,比较不同类的实例也不存在问题,因为它会返回false(很明显)。
【问题讨论】:
标签: php object comparison