2016-02-11 44 views
0

我遇到了一个解决Zend Framework 1.x中的限制的问题,目前我无法替换或更新它。我有一个新颖的想法,但我不确定是否有可能。是否可以实例化为子对象,然后在PHP中提取父对象?

基本问题是是否可以实例化一个扩展子对象,然后提取父对象,然后进行序列化?

为了说明为什么,本质上Zend_Mail类有一些非常愚蠢的限制和对其方法的类型检查,在我的情况下具体为$mail->setType()

我的想法是,我可以创造一个扩展的类(My_Zend_Mail extends Zend_Mail),然后重写setType() {...}方法在我的课,消除了限制,允许我在Zend_Mail类设置某些protected属性。限制是我需要将它作为序列化对象传递给远程服务器,并且该远程服务器在反序列化时不会拥有或识别My_Zend_Mail类。所以我需要序列化我的结尾处的父亲Zend_Mail

回到原来的问题,我可以提取父对象后,它已通过扩展子实例化?


编辑:我发现以下问题,其选择的答案提出了hackish的方式来重塑一个序列化的字符串,使其unserializes为不同的对象....

Convert/cast an stdClass object to another class

这可能会起作用,尽管进一步下来它看起来像有人通过Reflection类来做这件事,这更接近我正在寻找的东西。除非有其他建议,否则我可能会给出一个镜头并报告回来。

+0

对不起,我不认为你可以。为了获得父对象,你需要实例化父类。但是,通过使用“parent :: example()”来调用父“example”方法,您应该可以从子对象访问父方法和属性。 –

+0

对不起@CatalinCislariu,但很明显,我可以访问父项属性和方法......这就是我提出它的原因。就能够重塑或提取父母而言,你能否提供任何能够使你得出结论的东西? – oucil

+0

我错了,看底部。 –

回答

0

我能够通过使用略微不同的搜索条件找到另一个答案,处理更多与铸造比提取。这结束了对我的工作的解决方案基于反射类,我admitedly只用,原来答案就在这里发现了一个小经验:

https://stackoverflow.com/a/9812059/1058733

我在这里重复了后人的代码,但是这是直接复制...

/** 
* 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); 

所以我最后,反射类给我们提供了访问Zend_Mail内的受保护参数的功能,而无需扩展它。我可以重写这个方法来跳过我们扩展原始类来设置值的步骤,然后使用这个方法来进行转换,但是像这样离开它更有OO,并且允许我在其他地方使用这个方便的技巧。

希望有帮助!

相关问题