PHP/interface
About
In PHP, an interface is a set of public method-functions which can be required in either of two circumstances:
- "implements" in the declaration of a class
- This works almost identically to (the alternative of) declaring the interface's functions as abstract functions in a trait or parent class.
- as a type for a function argument or return value
- Advantages over using a class as a type:
- narrows down (more closely specifies) the function's expectations of a passed or returned object
- does not tie the object to a specific class/implementation hierarchy
- Advantages over using a class as a type:
This last point is one of the primary ways in which interfaces are useful: you may have a set of otherwise-unrelated classes with a set of descendants who need to do a set of things that were not part of their parent classes, and other parts of the code need to be able to recognize them as having this functionality. Having those descendants implement a common interface allows other code to require passed arguments to implement that interface, regardless of class-parentage.
Predefined
- instanceof works with both classes and interfaces
- interface_exists() returns TRUE if the interface has been declared in code that has executed.
Links
official
- interfaces
- There are some omissions on this page:
- "To implement an interface, the
implements
operator is used. All methods in the interface must be implemented within a class; failure to do so will result in a fatal error." This is not true if the class is declaredabstract
. In this context, an interface can be thought of as equivalent to a class whose methods are all abstract (and public). - There is no mention of whether interfaces can declare member variables. (I think they cannot, but I haven't tested this yet.)
- Note that they can declare (class) constants.
- "To implement an interface, the
- There are some omissions on this page:
other
- 2018-01-13 PHP Interfaces Explained
Notes
I thought I had derived this rule, but then when I went to test it without the backslash again, it was working fine:
If an interface is declared within a namespace but used outside of that namespace in am "implements" clause, the full namespace path must be prefixed with a backslash or it won't match:
class fcrUserAcct_admin extends fcrUserAcct implements fiLinkableRecord, \ferreteria\data\ifEditableRecord, fiEventAware {...where
ifEditableRecord
is being declared inside theferreteria\data
namespace.For all other uses, the backslash is optional or forbidden.
Perhaps there was some kind of code-caching error? If it happens again, try the backslash.