pub struct Closure(/* private fields */);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§
Source§impl Closure
impl Closure
Sourcepub fn wrap<T>(func: T) -> Selfwhere
T: PhpClosure + 'static,
pub fn wrap<T>(func: T) -> Selfwhere
T: PhpClosure + 'static,
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>);Sourcepub fn wrap_once<T>(func: T) -> Selfwhere
T: PhpOnceClosure + 'static,
pub fn wrap_once<T>(func: T) -> Selfwhere
T: PhpOnceClosure + 'static,
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§
Source§impl<'a> FromZendObject<'a> for &'a Closure
impl<'a> FromZendObject<'a> for &'a Closure
Source§fn from_zend_object(obj: &'a ZendObject) -> Result<Self>
fn from_zend_object(obj: &'a ZendObject) -> Result<Self>
Source§impl<'a> FromZendObjectMut<'a> for &'a mut Closure
impl<'a> FromZendObjectMut<'a> for &'a mut Closure
Source§fn from_zend_object_mut(obj: &'a mut ZendObject) -> Result<Self>
fn from_zend_object_mut(obj: &'a mut ZendObject) -> Result<Self>
Source§impl<'a> FromZvalMut<'a> for &'a mut Closure
impl<'a> FromZvalMut<'a> for &'a mut Closure
Source§impl IntoZendObject for Closure
impl IntoZendObject for Closure
Source§fn into_zend_object(self) -> Result<ZBox<ZendObject>>
fn into_zend_object(self) -> Result<ZBox<ZendObject>>
self into a Zend object. Read more