所以,
问题
很少有人知道,但是 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);
-因此,它将使用第一个不相等的属性进行比较。但是,上面的代码片段只是一些情况。我想确切地知道它是如何发生的以及为什么。
问题
问题是:它是如何工作的?我的意思是,更详细地说:
- 我能依靠PHP使用第一个不相等的属性进行比较这个事实吗?
- 如果属性的数量不相等会怎样?(即在代码执行期间动态添加了某些属性)
- 我能将
protected
/private
属性始终视为参与此类比较的属性吗?
等等 - 因此,如果有一些额外的条件/限制/规则会影响结果,请发布。 文档仅说明了 ==
/ ===
比较。另外,不同类的实例之间的比较是无关紧要的,因为它将返回false
(显然)。
DateTime
)。 - user703016