是否可以实例化为子对象,然后在PHP中提取父对象?

时间:2016-02-11 21:39:43

标签: php zend-framework serialization parent-child extends

我遇到了解决Zend Framework 1.x限制的问题,我现在无法替换或更新它。我有一个新颖的想法,但我不确定它是否可能。

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

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

我的想法是我可以创建一个扩展类(My_Zend_Mail extends Zend_Mail),然后覆盖我班级中的setType() {...}方法,消除限制,允许我设置某些protected属性Zend_Mail课程。My_Zend_Mail。限制是我需要将其作为序列化对象移交给远程服务器,并且该远程服务器在未序列化时将不会拥有或识别Zend_Mail类。所以我需要在我的最后序列化<DataGrid ItemsSource="{Binding MainMarkingList}" HorizontalAlignment="Center" VerticalAlignment="Top" AlternatingRowBackground="Gainsboro" AlternationCount="2" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Schedule" Binding="{Binding Schedule}"/> <DataGridTextColumn Header="Item" Binding="{Binding Item}"/> <DataGridTextColumn Header="Quantity" Binding="{Binding Qty}"/> <DataGridTextColumn Header="NP/Unit" Binding="{Binding NPUnit}"/> <DataGridTextColumn Header="First Var" Binding="{Binding FirstVarText}"/> <DataGridTextColumn Header="Second Var" Binding="{Binding SecondVarText}"/> <DataGridTextColumn Header="Third Var" Binding="{Binding ThirdVarText}"/> <DataGridTextColumn Header="Fourth Var" Binding="{Binding FourthVarText}"/> <DataGridTextColumn Header="Material" Binding="{Binding Material}"/> <DataGridTextColumn Header="Tag Size" Binding="{Binding TagSize}"/> </DataGrid.Columns> </DataGrid> 父母。

回到最初的问题,我可以通过扩展孩子实例化后提取父对象吗?

编辑:我发现了以下问题,其中所选答案提出了一种重复序列化字符串的hackish方式,以便将其反序列化为不同的对象....

Convert/cast an stdClass object to another class

这可能有用,虽然进一步下来看起来有人通过Reflection类也这样做,这更接近我正在寻找的东西。除非有其他建议,否则我可以给出一个镜头并报告回来?

1 个答案:

答案 0 :(得分:0)

我能够通过使用稍微不同的搜索条件找到另一个答案,更多地使用投射而不是提取。最终为我工作的解决方案基于反思课程,我很欣赏它只有一点点经验,原始答案可以在这里找到:

https://developers.facebook.com/docs/graph-api/using-graph-api#search

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

/**
 * 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并且允许我在其他地方使用这个方便的技巧。 / p>

希望有所帮助!