Struct ext_php_rs::closure::Closure [−][src]
pub struct Closure(_);
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 formBox<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 formBox<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>);
Trait Implementations
Extracts Self
from the source ZendObject
.
Extracts Self
from the source ZendObject
.
Attempts to convert self
into a Zend object.
Sets the content of a pre-existing zval. Returns a result containing nothing if setting the content was successful. Read more