我有一些共享一些属性的clases,我想做的事情:$ dog =(Dog)$ cat;
它是可行的还是有任何通用的工作?
它不是超类,或接口或以任何方式相关.他们只是2个不同的clases我想php将猫类的属性映射到狗并给我新的对象. -
我想我要指出一点点原因似乎是一件毫无意义的事情.
继承自diferents parent clases的ive clases导致ive基于保存方法创建了一个继承树,也许是我从开始时的坏事,但问题是我有很多实际上相同但仍与mysql和另一个交互的clases与xml文件.所以我有:class MySql_SomeEntity扩展SomeMysqlInteract {}和Xml_SomeEntity扩展SomeXmlInteract {}它更深一点的树,但问题是它.我不能让它们从同一个类继承,因为没有多重继承,并且我不能将当前与超级语言的交互分开,因为这将是一个很大的麻烦.
基本上每个中的属性都是实用的.
因为我有很多这样的机器人,我想做一些通用的铸造或类似的东西可以转换(将值传递给每个属性),但我试图以最简单的方式搜索这些条款的每个人.
在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的黑暗角落"并在用户级别上实现类型转换.
你可以使用上面的函数来编译不相似的类对象(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);