@@ -63,6 +63,14 @@ impl Zval {
6363 zval
6464 }
6565
66+ /// Creates a zval containing an empty array.
67+ #[ must_use]
68+ pub fn new_array ( ) -> Zval {
69+ let mut zval = Zval :: new ( ) ;
70+ zval. set_hashtable ( ZendHashTable :: new ( ) ) ;
71+ zval
72+ }
73+
6674 /// Dereference the zval, if it is a reference.
6775 #[ must_use]
6876 pub fn dereference ( & self ) -> & Self {
@@ -489,6 +497,18 @@ impl Zval {
489497 self . get_type ( ) == DataType :: Ptr
490498 }
491499
500+ /// Returns true if the zval is a scalar value (integer, float, string, or bool),
501+ /// false otherwise.
502+ ///
503+ /// This is equivalent to PHP's `is_scalar()` function.
504+ #[ must_use]
505+ pub fn is_scalar ( & self ) -> bool {
506+ matches ! (
507+ self . get_type( ) ,
508+ DataType :: Long | DataType :: Double | DataType :: String | DataType :: True | DataType :: False
509+ )
510+ }
511+
492512 /// Sets the value of the zval as a string. Returns nothing in a result when
493513 /// successful.
494514 ///
@@ -852,4 +872,39 @@ mod tests {
852872 assert ! ( zval. is_null( ) ) ;
853873 } ) ;
854874 }
875+
876+ #[ test]
877+ fn test_is_scalar ( ) {
878+ Embed :: run ( || {
879+ // Test scalar types - should return true
880+ let mut zval_long = Zval :: new ( ) ;
881+ zval_long. set_long ( 42 ) ;
882+ assert ! ( zval_long. is_scalar( ) ) ;
883+
884+ let mut zval_double = Zval :: new ( ) ;
885+ zval_double. set_double ( 1.5 ) ;
886+ assert ! ( zval_double. is_scalar( ) ) ;
887+
888+ let mut zval_true = Zval :: new ( ) ;
889+ zval_true. set_bool ( true ) ;
890+ assert ! ( zval_true. is_scalar( ) ) ;
891+
892+ let mut zval_false = Zval :: new ( ) ;
893+ zval_false. set_bool ( false ) ;
894+ assert ! ( zval_false. is_scalar( ) ) ;
895+
896+ let mut zval_string = Zval :: new ( ) ;
897+ zval_string
898+ . set_string ( "hello" , false )
899+ . expect ( "set_string should succeed" ) ;
900+ assert ! ( zval_string. is_scalar( ) ) ;
901+
902+ // Test non-scalar types - should return false
903+ let zval_null = Zval :: null ( ) ;
904+ assert ! ( !zval_null. is_scalar( ) ) ;
905+
906+ let zval_array = Zval :: new_array ( ) ;
907+ assert ! ( !zval_array. is_scalar( ) ) ;
908+ } ) ;
909+ }
855910}
0 commit comments