在我的 php 应用程序中,我一直在将对象与通常的相等比较运算符进行比较,例如:
if ($objectA == $objectB) { ... }
最近我实现了代理(用于加载昂贵的对象),但这意味着相等运算符不再起作用。有没有一种简单的方法来解决这个问题?一个不依赖反射的?
目前,我已经求助于测试每个对象的唯一标识符,例如
if ($objectA->getId() == $objectB->getId) { ... }
但这有两个问题:1)我需要重构所有现有代码,2)将来我可能需要比较作为值对象(不是实体)的对象。
我不希望有一个简单的解决方案,因为我认为它需要一种新的魔法方法......
这是我的 AbstractProxy 类。任何帮助表示赞赏...
abstract class KOOP_Base_AbstractProxy
implements KOOP_Base_iDomain
{
use KOOP_Trait_Helper_Helper;
/**
* @var integer Object identifier
*/
protected $_id = null;
/**
* @var KOOP_Base_AbstractMapper
*/
protected $_mapper = null;
/**
* @var KOOP_Base_AbstractDomain Actual object
*/
protected $_subject = null;
/**
* Store object id for lazy loading
*
* @param integer $id Object identifier
* @param string $mapper Mapper by which to retrieve object
*/
public function __construct($id, $mapper)
{
$this->_id = $id;
$this->_mapper = $mapper;
}
/**
* Get subject
*
* @return KOOP_Base_AbstractDomain
*/
protected function getSubject()
{
if (!$this->_subject) {
$this->_subject = $this->getMapper($this->_mapper)->find($this->_id);
}
return $this->_subject;
}
/**
* Get property
*
* @param string $property
* @return mixed
*/
public function __get($property)
{
return $this->getSubject()->$property;
}
/**
* Set property
*
* @param string $property
* @param mixed $value
* @return void
*/
public function __set($property, $value)
{
$this->getSubject()->$property = $value;
}
/**
* Is property set?
*
* @param $property
* @return boolean
*/
public function __isset($property)
{
return isset($this->getSubject()->$property);
}
/**
* Unset property
*
* @param string $property
* @return mixed
*/
public function __unset($property)
{
unset($this->getSubject()->$property);
}
/**
* Call method
*
* @param string $method Method to call
* @param array $params Parameters to pass
* @return mixed
*/
public function __call($method, array $params)
{
return call_user_func_array(array($this->getSubject(), $method), $params);
}
/**
* Get id
*
* Saves having to retrieve the entire object when only the ID is required.
*/
public function getId()
{
return $this->_id;
}
}