如何在 PHP 中强制转换对象

2022-08-30 08:58:17

我有一些共享一些属性的类,我想做这样的事情:

$dog = (Dog) $cat;

是否可能,或者是否有任何通用的解决方法?

它不是一个超类,也不是一个接口或以任何方式相关的。它们只是2个不同的类,我想php将属性从猫类映射到狗,并给我新对象。–

我想我必须指定更多的原因,这似乎是一件毫无意义的事情。

我有从不同的父类继承的类,因为我已经根据保存方法创建了一个继承树,也许从一开始就不好,但问题是我有很多类实际上相等,但一个与mysql交互,另一个与xml文件交互。所以我有:

class MySql_SomeEntity extends SomeMysqlInteract{}

Xml_SomeEntity extends SomeXmlInteract{}

这是一棵更深的树,但问题是。我不能让他们从同一个类继承,因为不允许多重继承,而且我不能单独与超克拉斯的交互,因为这将是一个大麻烦。

基本上,每个属性中的属性都是实用的。

因为我有很多这样的匹配类,我想做一些通用的转换或类似的东西,可以转换(将值传递给每个属性),但我试图搜索最简单的方法到这个类的每个人。


答案 1

您可以使用上述函数来强制转换不相似的类对象(PHP > = 5.3)

/**
 * Class casting
 *
 * @param string|object $destination
 * @param object $sourceObject
 * @return object
 */
function cast($destination, $sourceObject)
{
    if (is_string($destination)) {
        $destination = new $destination();
    }
    $sourceReflection = new ReflectionObject($sourceObject);
    $destinationReflection = new ReflectionObject($destination);
    $sourceProperties = $sourceReflection->getProperties();
    foreach ($sourceProperties as $sourceProperty) {
        $sourceProperty->setAccessible(true);
        $name = $sourceProperty->getName();
        $value = $sourceProperty->getValue($sourceObject);
        if ($destinationReflection->hasProperty($name)) {
            $propDest = $destinationReflection->getProperty($name);
            $propDest->setAccessible(true);
            $propDest->setValue($destination,$value);
        } else {
            $destination->$name = $value;
        }
    }
    return $destination;
}

例:

class A 
{
  private $_x;   
}

class B 
{
  public $_x;   
}

$a = new A();
$b = new B();

$x = cast('A',$b);
$x = cast('B',$a);

答案 2

PHP 中没有用于用户定义对象的类型转换的内置方法。也就是说,这里有几种可能的解决方案:

1)使用如下所示的函数来反序列化对象,更改字符串,以便在新对象反序列化后将所需的属性包含在新对象中。

function cast($obj, $to_class) {
  if(class_exists($to_class)) {
    $obj_in = serialize($obj);
    $obj_out = 'O:' . strlen($to_class) . ':"' . $to_class . '":' . substr($obj_in, $obj_in[2] + 7);
    return unserialize($obj_out);
  }
  else
    return false;
}

2)或者,您可以使用反射/手动迭代所有属性或使用get_object_vars())来复制对象的属性。

本文应该启发您了解“PHP的黑暗角落”并在用户级别实现类型转换。


推荐