Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære PHP zval to C Type Conversion | Native Memory and Type Conversion
PHP FFI Internals

bookPHP zval to C Type Conversion

PHP FFI (Foreign Function Interface) bridges PHP and native C code by translating PHP variables—known internally as zvals—to their closest C equivalents. This conversion process is critical for correct data exchange and function calls between PHP and C. Most simple scalar types are mapped automatically: PHP int values are converted to C int or long types, float to C float or double, and string to C char * (with a null terminator added). However, not all conversions are seamless. For example, PHP bool is mapped to C int (with true as 1 and false as 0). When using FFI, PHP will attempt to convert the value you pass to the closest compatible C type, but for more complex or ambiguous types, explicit casting may be necessary. For instance, when passing a PHP string to a function expecting a pointer to a struct, you must first create a suitable FFI object. Automatic conversion is limited to scalars and simple pointers; anything more complex requires careful handling.

main.php

main.php

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
<?php // Define a simple C function: int add_ints(int a, int b) $ffi = FFI::cdef(" int add_ints(int a, int b); double add_doubles(double a, double b); int accept_string(const char* str); ", " int add_ints(int a, int b) { return a + b; } double add_doubles(double a, double b) { return a + b; } int accept_string(const char* str) { return (str != NULL) ? (int)strlen(str) : -1; } "); // Passing int values (automatic conversion) echo $ffi->add_ints(2, 3), PHP_EOL; // 5 // Passing float values to a function expecting int (automatic conversion, but with truncation) echo $ffi->add_ints(2.7, 3.9), PHP_EOL; // 5 (floats are truncated to ints) // Passing string to a function expecting int (conversion fails) try { echo $ffi->add_ints("hello", 3), PHP_EOL; } catch (FFI\Exception $e) { echo "Error: ", $e->getMessage(), PHP_EOL; } // Passing float values to a C double function (automatic conversion) echo $ffi->add_doubles(2.5, 3.5), PHP_EOL; // 6.0 // Passing int values to a C double function (automatic conversion) echo $ffi->add_doubles(2, 3), PHP_EOL; // 5.0 // Passing PHP string to a function expecting const char* (automatic conversion) echo $ffi->accept_string("hello"), PHP_EOL; // 5 // Passing PHP int to a function expecting const char* (conversion fails) try { echo $ffi->accept_string(123), PHP_EOL; } catch (FFI\Exception $e) { echo "Error: ", $e->getMessage(), PHP_EOL; } ?>

A common mistake when working with PHP FFI is attempting to pass incompatible PHP types to C functions. For example, passing a PHP array to a parameter expecting an int will not work—PHP cannot automatically convert arrays to numeric C types, and this will cause a runtime error or, worse, undefined behavior. Similarly, passing an object or resource to a C pointer type without proper conversion will lead to errors. Always ensure that the PHP value's type matches the expected C type, or perform explicit casting or conversion using FFI's facilities before passing the value.

question mark

Which of the following statements about PHP zval to C type conversion via FFI is correct?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 2

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

bookPHP zval to C Type Conversion

Sveip for å vise menyen

PHP FFI (Foreign Function Interface) bridges PHP and native C code by translating PHP variables—known internally as zvals—to their closest C equivalents. This conversion process is critical for correct data exchange and function calls between PHP and C. Most simple scalar types are mapped automatically: PHP int values are converted to C int or long types, float to C float or double, and string to C char * (with a null terminator added). However, not all conversions are seamless. For example, PHP bool is mapped to C int (with true as 1 and false as 0). When using FFI, PHP will attempt to convert the value you pass to the closest compatible C type, but for more complex or ambiguous types, explicit casting may be necessary. For instance, when passing a PHP string to a function expecting a pointer to a struct, you must first create a suitable FFI object. Automatic conversion is limited to scalars and simple pointers; anything more complex requires careful handling.

main.php

main.php

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
<?php // Define a simple C function: int add_ints(int a, int b) $ffi = FFI::cdef(" int add_ints(int a, int b); double add_doubles(double a, double b); int accept_string(const char* str); ", " int add_ints(int a, int b) { return a + b; } double add_doubles(double a, double b) { return a + b; } int accept_string(const char* str) { return (str != NULL) ? (int)strlen(str) : -1; } "); // Passing int values (automatic conversion) echo $ffi->add_ints(2, 3), PHP_EOL; // 5 // Passing float values to a function expecting int (automatic conversion, but with truncation) echo $ffi->add_ints(2.7, 3.9), PHP_EOL; // 5 (floats are truncated to ints) // Passing string to a function expecting int (conversion fails) try { echo $ffi->add_ints("hello", 3), PHP_EOL; } catch (FFI\Exception $e) { echo "Error: ", $e->getMessage(), PHP_EOL; } // Passing float values to a C double function (automatic conversion) echo $ffi->add_doubles(2.5, 3.5), PHP_EOL; // 6.0 // Passing int values to a C double function (automatic conversion) echo $ffi->add_doubles(2, 3), PHP_EOL; // 5.0 // Passing PHP string to a function expecting const char* (automatic conversion) echo $ffi->accept_string("hello"), PHP_EOL; // 5 // Passing PHP int to a function expecting const char* (conversion fails) try { echo $ffi->accept_string(123), PHP_EOL; } catch (FFI\Exception $e) { echo "Error: ", $e->getMessage(), PHP_EOL; } ?>

A common mistake when working with PHP FFI is attempting to pass incompatible PHP types to C functions. For example, passing a PHP array to a parameter expecting an int will not work—PHP cannot automatically convert arrays to numeric C types, and this will cause a runtime error or, worse, undefined behavior. Similarly, passing an object or resource to a C pointer type without proper conversion will lead to errors. Always ensure that the PHP value's type matches the expected C type, or perform explicit casting or conversion using FFI's facilities before passing the value.

question mark

Which of the following statements about PHP zval to C type conversion via FFI is correct?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 2
some-alt