I'm essentially trying to emulate the .NET style boxing/unboxing functionality natively in PHP while maintaining strict type checking and not affecting bc or performance (as part of a larger project converting the .NET BFL to a php extension). I already have a large component of it working in userland classes which uses a ZConvert class that calls the IComparable interface of the classes (same as .NET). Using PConvert::ToBoolean($ZBool) everywhere is the nicest solution.
In .NET all boxable types descend from a ValueType class. The optimal solution would be to have zend understand a IValueType interface and perform the boxing/unboxing (probably using the cast_object handler or accessing a ce->property value which is how .NET handles it internally) as necessary. This would handle the unboxing for the majority of cases I think, so you could even pass IValueTypes to standard php functions (which parse their params using the convert_to_* functions. final class ZString extends PValueType implements IValueType { ... } final class ZInt32 extends PValueType implements IValueType { ... } ... etc for the native PHP types $zstring = new ZString("PHP "); // $zstring = (object)"PHP "; $zdouble = new ZDouble(5.1); // or possibly even $zint = (object)5.1; $zstring .= $zdouble; $zdouble *= 2; $int = strlen($zstring); // goes through zend_parse_parameters which understands an IValueType object. Where $zstring and $zdouble remain their respective object types. And then going the other way... if it was possible for an extension to provide a callback to the (object) ZEND_CAST then the following would be possible (the closest I think it could get to real boxing) Note the TypeHints forcing a true object interface, then the explicit cast in the function call. final class ZString extends ZValueType implements IValueType { public static function Concat(ZString $strA, ZString $strB) { return new ZString($strA.$strB); } } $zstring = new ZString("PHP "); $zstring = ZString::Concat($zstring, (object)"5.1.0"); The callback would determine the object type being cast and create a new ZValueType of that object type. I think my thoughts got all jumbled describing this...I know the unboxing of the types will work with no changes....its just the boxing that would require changes by registering a callback during object casts. Like I said, this is mainly for the experience right now, but I would like to release the .NET BFL extension as some point in time. (Along with the ASP page/component processing model) How cool would it be to develop PHP web pages visually in Visual Studio? I'll tackle that part of it when I get this part done :) Bob Silva -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php