Struct ext_php_rs::closure::Closure[][src]

pub struct Closure(_);
This is supported 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

Performs the conversion.

Performs the conversion.

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.