use*_*599 57 php casting object
我有一些共享一些属性的clases,我想做的事情:$ dog =(Dog)$ cat;
它是可行的还是有任何通用的工作?
它不是超类,或接口或以任何方式相关.他们只是2个不同的clases我想php将猫类的属性映射到狗并给我新的对象. -
我想我要指出一点点原因似乎是一件毫无意义的事情.
继承自diferents parent clases的ive clases导致ive基于保存方法创建了一个继承树,也许是我从开始时的坏事,但问题是我有很多实际上相同但仍与mysql和另一个交互的clases与xml文件.所以我有:class MySql_SomeEntity扩展SomeMysqlInteract {}和Xml_SomeEntity扩展SomeXmlInteract {}它更深一点的树,但问题是它.我不能让它们从同一个类继承,因为没有多重继承,并且我不能将当前与超级语言的交互分开,因为这将是一个很大的麻烦.
基本上每个中的属性都是实用的.
因为我有很多这样的机器人,我想做一些通用的铸造或类似的东西可以转换(将值传递给每个属性),但我试图以最简单的方式搜索这些条款的每个人.
use*_*120 30
在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;
}
Run Code Online (Sandbox Code Playgroud)
2)或者,您可以使用反射/手动迭代它们或使用get_object_vars()复制对象的属性.
本文应该启发您关于"PHP的黑暗角落"并在用户级别上实现类型转换.
小智 30
你可以使用上面的函数来编译不相似的类对象(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;
}
Run Code Online (Sandbox Code Playgroud)
例:
class A
{
private $_x;
}
class B
{
public $_x;
}
$a = new A();
$b = new B();
$x = cast('A',$b);
$x = cast('B',$a);
Run Code Online (Sandbox Code Playgroud)
不使用继承(如作者所述),似乎您正在寻找一种解决方案,该解决方案可以在开发人员知道并理解 2 个类的相似性的前提下,将transform一个类转换为另一个类。
没有用于在对象之间转换的现有解决方案。您可以尝试的是:
| 归档时间: |
|
| 查看次数: |
117063 次 |
| 最近记录: |