Type Definition ext_php_rs::zend::ClassEntry
source · pub type ClassEntry = zend_class_entry;
Expand description
A PHP class entry.
Represents a class registered with the PHP interpreter.
Implementations§
source§impl ClassEntry
impl ClassEntry
sourcepub fn try_find(name: &str) -> Option<&'static Self>
pub fn try_find(name: &str) -> Option<&'static Self>
Attempts to find a reference to a class in the global class table.
Returns a reference to the class if found, or None
if the class
could not be found or the class table has not been initialized.
sourcepub fn flags(&self) -> ClassFlags
pub fn flags(&self) -> ClassFlags
Returns the class flags.
Examples found in repository?
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
pub fn is_interface(&self) -> bool {
self.flags().contains(ClassFlags::Interface)
}
/// Checks if the class is an instance of another class or interface.
///
/// # Parameters
///
/// * `other` - The inherited class entry to check.
pub fn instance_of(&self, other: &ClassEntry) -> bool {
if self == other {
return true;
}
if other.is_interface() {
return self
.interfaces()
.map_or(false, |mut it| it.any(|ce| ce == other));
}
std::iter::successors(self.parent(), |p| p.parent()).any(|ce| ce == other)
}
/// Returns an iterator of all the interfaces that the class implements.
///
/// Returns [`None`] if the interfaces have not been resolved on the
/// class.
pub fn interfaces(&self) -> Option<impl Iterator<Item = &ClassEntry>> {
self.flags()
.contains(ClassFlags::ResolvedInterfaces)
.then(|| unsafe {
(0..self.num_interfaces)
.into_iter()
.map(move |i| *self.__bindgen_anon_3.interfaces.offset(i as _))
.filter_map(|ptr| ptr.as_ref())
})
}
/// Returns the parent of the class.
///
/// If the parent of the class has not been resolved, it attempts to find
/// the parent by name. Returns [`None`] if the parent was not resolved
/// and the parent was not able to be found by name.
pub fn parent(&self) -> Option<&Self> {
if self.flags().contains(ClassFlags::ResolvedParent) {
unsafe { self.__bindgen_anon_1.parent.as_ref() }
} else {
let name = unsafe { self.__bindgen_anon_1.parent_name.as_ref()? };
Self::try_find(name.as_str().ok()?)
}
}
}
impl PartialEq for ClassEntry {
fn eq(&self, other: &Self) -> bool {
std::ptr::eq(self, other)
}
}
impl Debug for ClassEntry {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let name: String = unsafe { self.name.as_ref() }
.and_then(|s| s.try_into().ok())
.ok_or(std::fmt::Error)?;
f.debug_struct("ClassEntry")
.field("name", &name)
.field("flags", &self.flags())
.field("is_interface", &self.is_interface())
.field(
"interfaces",
&self.interfaces().map(|iter| iter.collect::<Vec<_>>()),
)
.field("parent", &self.parent())
.finish()
}
More examples
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
pub fn throw_with_code(ex: &ClassEntry, code: i32, message: &str) -> Result<()> {
let flags = ex.flags();
// Can't throw an interface or abstract class.
if flags.contains(ClassFlags::Interface) || flags.contains(ClassFlags::Abstract) {
return Err(Error::InvalidException(flags));
}
// SAFETY: We are given a reference to a `ClassEntry` therefore when we cast it
// to a pointer it will be valid.
unsafe {
zend_throw_exception_ex(
(ex as *const _) as *mut _,
code as _,
CString::new("%s")?.as_ptr(),
CString::new(message)?.as_ptr(),
)
};
Ok(())
}
sourcepub fn is_interface(&self) -> bool
pub fn is_interface(&self) -> bool
Returns true
if the class entry is an interface, and false
otherwise.
Examples found in repository?
More examples
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
pub fn instance_of(&self, other: &ClassEntry) -> bool {
if self == other {
return true;
}
if other.is_interface() {
return self
.interfaces()
.map_or(false, |mut it| it.any(|ce| ce == other));
}
std::iter::successors(self.parent(), |p| p.parent()).any(|ce| ce == other)
}
/// Returns an iterator of all the interfaces that the class implements.
///
/// Returns [`None`] if the interfaces have not been resolved on the
/// class.
pub fn interfaces(&self) -> Option<impl Iterator<Item = &ClassEntry>> {
self.flags()
.contains(ClassFlags::ResolvedInterfaces)
.then(|| unsafe {
(0..self.num_interfaces)
.into_iter()
.map(move |i| *self.__bindgen_anon_3.interfaces.offset(i as _))
.filter_map(|ptr| ptr.as_ref())
})
}
/// Returns the parent of the class.
///
/// If the parent of the class has not been resolved, it attempts to find
/// the parent by name. Returns [`None`] if the parent was not resolved
/// and the parent was not able to be found by name.
pub fn parent(&self) -> Option<&Self> {
if self.flags().contains(ClassFlags::ResolvedParent) {
unsafe { self.__bindgen_anon_1.parent.as_ref() }
} else {
let name = unsafe { self.__bindgen_anon_1.parent_name.as_ref()? };
Self::try_find(name.as_str().ok()?)
}
}
}
impl PartialEq for ClassEntry {
fn eq(&self, other: &Self) -> bool {
std::ptr::eq(self, other)
}
}
impl Debug for ClassEntry {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let name: String = unsafe { self.name.as_ref() }
.and_then(|s| s.try_into().ok())
.ok_or(std::fmt::Error)?;
f.debug_struct("ClassEntry")
.field("name", &name)
.field("flags", &self.flags())
.field("is_interface", &self.is_interface())
.field(
"interfaces",
&self.interfaces().map(|iter| iter.collect::<Vec<_>>()),
)
.field("parent", &self.parent())
.finish()
}
sourcepub fn instance_of(&self, other: &ClassEntry) -> bool
pub fn instance_of(&self, other: &ClassEntry) -> bool
Checks if the class is an instance of another class or interface.
Parameters
other
- The inherited class entry to check.
sourcepub fn interfaces(&self) -> Option<impl Iterator<Item = &ClassEntry>>
pub fn interfaces(&self) -> Option<impl Iterator<Item = &ClassEntry>>
Returns an iterator of all the interfaces that the class implements.
Returns None
if the interfaces have not been resolved on the
class.
Examples found in repository?
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
pub fn instance_of(&self, other: &ClassEntry) -> bool {
if self == other {
return true;
}
if other.is_interface() {
return self
.interfaces()
.map_or(false, |mut it| it.any(|ce| ce == other));
}
std::iter::successors(self.parent(), |p| p.parent()).any(|ce| ce == other)
}
/// Returns an iterator of all the interfaces that the class implements.
///
/// Returns [`None`] if the interfaces have not been resolved on the
/// class.
pub fn interfaces(&self) -> Option<impl Iterator<Item = &ClassEntry>> {
self.flags()
.contains(ClassFlags::ResolvedInterfaces)
.then(|| unsafe {
(0..self.num_interfaces)
.into_iter()
.map(move |i| *self.__bindgen_anon_3.interfaces.offset(i as _))
.filter_map(|ptr| ptr.as_ref())
})
}
/// Returns the parent of the class.
///
/// If the parent of the class has not been resolved, it attempts to find
/// the parent by name. Returns [`None`] if the parent was not resolved
/// and the parent was not able to be found by name.
pub fn parent(&self) -> Option<&Self> {
if self.flags().contains(ClassFlags::ResolvedParent) {
unsafe { self.__bindgen_anon_1.parent.as_ref() }
} else {
let name = unsafe { self.__bindgen_anon_1.parent_name.as_ref()? };
Self::try_find(name.as_str().ok()?)
}
}
}
impl PartialEq for ClassEntry {
fn eq(&self, other: &Self) -> bool {
std::ptr::eq(self, other)
}
}
impl Debug for ClassEntry {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let name: String = unsafe { self.name.as_ref() }
.and_then(|s| s.try_into().ok())
.ok_or(std::fmt::Error)?;
f.debug_struct("ClassEntry")
.field("name", &name)
.field("flags", &self.flags())
.field("is_interface", &self.is_interface())
.field(
"interfaces",
&self.interfaces().map(|iter| iter.collect::<Vec<_>>()),
)
.field("parent", &self.parent())
.finish()
}
sourcepub fn parent(&self) -> Option<&Self>
pub fn parent(&self) -> Option<&Self>
Returns the parent of the class.
If the parent of the class has not been resolved, it attempts to find
the parent by name. Returns None
if the parent was not resolved
and the parent was not able to be found by name.
Examples found in repository?
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
pub fn instance_of(&self, other: &ClassEntry) -> bool {
if self == other {
return true;
}
if other.is_interface() {
return self
.interfaces()
.map_or(false, |mut it| it.any(|ce| ce == other));
}
std::iter::successors(self.parent(), |p| p.parent()).any(|ce| ce == other)
}
/// Returns an iterator of all the interfaces that the class implements.
///
/// Returns [`None`] if the interfaces have not been resolved on the
/// class.
pub fn interfaces(&self) -> Option<impl Iterator<Item = &ClassEntry>> {
self.flags()
.contains(ClassFlags::ResolvedInterfaces)
.then(|| unsafe {
(0..self.num_interfaces)
.into_iter()
.map(move |i| *self.__bindgen_anon_3.interfaces.offset(i as _))
.filter_map(|ptr| ptr.as_ref())
})
}
/// Returns the parent of the class.
///
/// If the parent of the class has not been resolved, it attempts to find
/// the parent by name. Returns [`None`] if the parent was not resolved
/// and the parent was not able to be found by name.
pub fn parent(&self) -> Option<&Self> {
if self.flags().contains(ClassFlags::ResolvedParent) {
unsafe { self.__bindgen_anon_1.parent.as_ref() }
} else {
let name = unsafe { self.__bindgen_anon_1.parent_name.as_ref()? };
Self::try_find(name.as_str().ok()?)
}
}
}
impl PartialEq for ClassEntry {
fn eq(&self, other: &Self) -> bool {
std::ptr::eq(self, other)
}
}
impl Debug for ClassEntry {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let name: String = unsafe { self.name.as_ref() }
.and_then(|s| s.try_into().ok())
.ok_or(std::fmt::Error)?;
f.debug_struct("ClassEntry")
.field("name", &name)
.field("flags", &self.flags())
.field("is_interface", &self.is_interface())
.field(
"interfaces",
&self.interfaces().map(|iter| iter.collect::<Vec<_>>()),
)
.field("parent", &self.parent())
.finish()
}