当前位置:  开发笔记 > 编程语言 > 正文

如何在PHP中转换对象

如何解决《如何在PHP中转换对象》经验,为你挑选了2个好方法。

我有一些共享一些属性的clases,我想做的事情:$ dog =(Dog)$ cat;

它是可行的还是有任何通用的工作?

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

我想我要指出一点点原因似乎是一件毫无意义的事情.

继承自diferents parent clases的ive clases导致ive基于保存方法创建了一个继承树,也许是我从开始时的坏事,但问题是我有很多实际上相同但仍与mysql和另一个交互的clases与xml文件.所以我有:class MySql_SomeEntity扩展SomeMysqlInteract {}和Xml_SomeEntity扩展SomeXmlInteract {}它更深一点的树,但问题是它.我不能让它们从同一个类继承,因为没有多重继承,并且我不能将当前与超级语言的交互分开,因为这将是一个很大的麻烦.

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

因为我有很多这样的机器人,我想做一些通用的铸造或类似的东西可以转换(将值传递给每个属性),但我试图以最简单的方式搜索这些条款的每个人.



1> user250120..:

在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的黑暗角落"并在用户级别上实现类型转换.


最糟糕的想法.如果您正在尝试开发专业应用程序,请向任何人阅读此内容,请忽略此建议.这可能是有趣的,可以创建一个有趣的脚本为你做事情,但我认为这是非常不值得推荐在正式项目上提供它.请看下面的帖子,看看更好的方法.

2> 小智..:

你可以使用上面的函数来编译不相似的类对象(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);

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有