@@ -62,6 +62,14 @@ impl Zval {
6262 zval
6363 }
6464
65+ /// Creates a zval containing an empty array.
66+ #[ must_use]
67+ pub fn new_array ( ) -> Zval {
68+ let mut zval = Zval :: new ( ) ;
69+ zval. set_hashtable ( ZendHashTable :: new ( ) ) ;
70+ zval
71+ }
72+
6573 /// Dereference the zval, if it is a reference.
6674 #[ must_use]
6775 pub fn dereference ( & self ) -> & Self {
@@ -488,6 +496,18 @@ impl Zval {
488496 self . get_type ( ) == DataType :: Ptr
489497 }
490498
499+ /// Returns true if the zval is a scalar value (integer, float, string, or bool),
500+ /// false otherwise.
501+ ///
502+ /// This is equivalent to PHP's `is_scalar()` function.
503+ #[ must_use]
504+ pub fn is_scalar ( & self ) -> bool {
505+ matches ! (
506+ self . get_type( ) ,
507+ DataType :: Long | DataType :: Double | DataType :: String | DataType :: True | DataType :: False
508+ )
509+ }
510+
491511 /// Sets the value of the zval as a string. Returns nothing in a result when
492512 /// successful.
493513 ///
@@ -812,4 +832,37 @@ mod tests {
812832 assert ! ( zval. is_null( ) ) ;
813833 } ) ;
814834 }
835+
836+ #[ test]
837+ fn test_is_scalar ( ) {
838+ Embed :: run ( || {
839+ // Test scalar types - should return true
840+ let mut zval_long = Zval :: new ( ) ;
841+ zval_long. set_long ( 42 ) ;
842+ assert ! ( zval_long. is_scalar( ) ) ;
843+
844+ let mut zval_double = Zval :: new ( ) ;
845+ zval_double. set_double ( 1.5 ) ;
846+ assert ! ( zval_double. is_scalar( ) ) ;
847+
848+ let mut zval_true = Zval :: new ( ) ;
849+ zval_true. set_bool ( true ) ;
850+ assert ! ( zval_true. is_scalar( ) ) ;
851+
852+ let mut zval_false = Zval :: new ( ) ;
853+ zval_false. set_bool ( false ) ;
854+ assert ! ( zval_false. is_scalar( ) ) ;
855+
856+ let mut zval_string = Zval :: new ( ) ;
857+ zval_string. set_string ( "hello" , false ) . expect ( "set_string should succeed" ) ;
858+ assert ! ( zval_string. is_scalar( ) ) ;
859+
860+ // Test non-scalar types - should return false
861+ let zval_null = Zval :: null ( ) ;
862+ assert ! ( !zval_null. is_scalar( ) ) ;
863+
864+ let zval_array = Zval :: new_array ( ) ;
865+ assert ! ( !zval_array. is_scalar( ) ) ;
866+ } ) ;
867+ }
815868}
0 commit comments