Struct ext_php_rs::closure::Closure

source ·
pub struct Closure(_);
Available on crate feature closure only.
Expand description

Wrapper around a Rust closure, which can be exported to PHP.

Closures can have up to 8 parameters, all must implement FromZval, and can return anything that implements IntoZval. Closures must have a static lifetime, and therefore cannot modify any self references.

Internally, closures are implemented as a PHP class. A class RustClosure is registered with an __invoke method:

<?php

class RustClosure {
    public function __invoke(...$args): mixed {
        // ...    
    }
}

The Rust closure is then double boxed, firstly as a Box<dyn Fn(...) -> ...> (depending on the signature of the closure) and then finally boxed as a Box<dyn PhpClosure>. This is a workaround, as PhpClosure is not generically implementable on types that implement Fn(T, ...) -> Ret. Make a suggestion issue if you have a better idea of implementing this!.

When the __invoke method is called from PHP, the invoke method is called on the dyn PhpClosure\ trait object, and from there everything is basically the same as a regular PHP function.

Implementations§

Wraps a Fn or FnMut Rust closure into a type which can be returned to PHP.

The closure can accept up to 8 arguments which implement IntoZval, and can return any type which implements FromZval. The closure must have a static lifetime, so cannot reference self.

Parameters
  • func - The closure to wrap. Should be boxed in the form Box<dyn Fn[Mut](...) -> ...>.
Example
use ext_php_rs::closure::Closure;

let closure = Closure::wrap(Box::new(|name| {
    format!("Hello {}", name)
}) as Box<dyn Fn(String) -> String>);

Wraps a FnOnce Rust closure into a type which can be returned to PHP. If the closure is called more than once from PHP, an exception is thrown.

The closure can accept up to 8 arguments which implement IntoZval, and can return any type which implements FromZval. The closure must have a static lifetime, so cannot reference self.

Parameters
  • func - The closure to wrap. Should be boxed in the form Box<dyn FnOnce(...) -> ...>.
Example
use ext_php_rs::closure::Closure;

let name: String = "Hello world".into();
let closure = Closure::wrap_once(Box::new(|| {
    name
}) as Box<dyn FnOnce() -> String>);

Builds the class entry for Closure, registering it with PHP. This function should only be called once inside your module startup function.

Panics

Panics if the function is called more than once.

Trait Implementations§

Extracts Self from the source ZendObject.
Extracts Self from the source ZendObject.
The corresponding type of the implemented value in PHP.
Attempts to retrieve an instance of Self from a reference to a Zval. Read more
The corresponding type of the implemented value in PHP.
Attempts to retrieve an instance of Self from a mutable reference to a Zval. Read more
Attempts to convert self into a Zend object.
The corresponding type of the implemented value in PHP.
Sets the content of a pre-existing zval. Returns a result containing nothing if setting the content was successful. Read more
Converts a Rust primitive type into a Zval. Returns a result containing the Zval if successful. Read more
PHP class name of the registered class.
Returns a reference to the class metadata, which stores the class entry and handlers. Read more
Returns a hash table containing the properties of the class. Read more
Optional class constructor.

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.