Ответ 1
Я смог найти другой ответ, используя несколько разные критерии поиска, которые больше касаются литья, чем извлечение. Решение, которое в конечном итоге работало для меня, основывалось на классах отражения, с которыми я, с признательностью, обладаю небольшим опытом, исходный ответ можно найти здесь:
Я дублирую код для потомков здесь, но это было скопировано прямо...
/**
* 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, и позволяет мне использовать этот удобный трюк в другом месте.
Надеюсь, что это поможет!