class
Basic class definitions begin with the keyword class
, followed by a class name, followed by a pair of curly braces which enclose the definitions of the properties and methods belonging to the class.
The class name can be any valid label, provided it is not a PHP reserved word. A valid class name starts with a letter or underscore, followed by any number of letters, numbers, or underscores. As a regular expression, it would be expressed thus: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$
.
A class may contain its own constants, variables [called "properties"], and functions [called "methods"].
Example #1 Simple Class definition
The pseudo-variable $this is available when a method is called from within an object context. $this is the value of the calling object.
Warning
Calling a non-static method statically throws an Error. Prior to PHP 8.0.0, this would generate a deprecation notice, and $this would be undefined.
Example #2 Some examples of the $this pseudo-variable
Output of the above example in PHP 7:
$this is defined [A] Deprecated: Non-static method A::foo[] should not be called statically in %s on line 27 $this is not defined. Deprecated: Non-static method A::foo[] should not be called statically in %s on line 20 $this is not defined. Deprecated: Non-static method B::bar[] should not be called statically in %s on line 32 Deprecated: Non-static method A::foo[] should not be called statically in %s on line 20 $this is not defined.
Output of the above example in PHP 8:
$this is defined [A] Fatal error: Uncaught Error: Non-static method A::foo[] cannot be called statically in %s :27 Stack trace: #0 {main} thrown in %s on line 27
new
To create an instance of a class, the new
keyword must be used. An object will always be created unless the object has a constructor defined that throws an exception on error. Classes should be defined before instantiation [and in
some cases this is a requirement].
If a string containing the name of a class is used with new
, a new instance of that class will be created. If the class is in a namespace, its fully qualified name must be used when doing this.
Note:
If there are no arguments to be passed to the class's constructor, parentheses after the class name may be omitted.
Example #3 Creating an instance
As of PHP 8.0.0, using new
with arbitrary expressions is supported. This allows more complex instantiation if the expression produces a string. The expressions must be wrapped in parentheses.
Example #4 Creating an instance using an arbitrary expression
In the given example we show multiple examples of valid arbitrary expressions that produce a class name. This shows a call to a function, string concatenation, and the
::class
constant.
Output of the above example in PHP 8:
object[ClassA]#1 [0] { } object[ClassB]#1 [0] { } object[ClassC]#1 [0] { } object[ClassD]#1 [0] { }
In the class context, it is possible to create a new object by new self
and new parent
.
When assigning an already created instance of a class to a new variable, the new variable will access the same instance as the object that was assigned. This behaviour is the same when passing instances to a function. A copy of an already created object can be made by cloning it.
Example #5 Object Assignment
The above example will output:
NULL NULL object[SimpleClass]#1 [1] { ["var"]=> string[30] "$assigned will have this value" }
It's possible to create instances of an object in a couple of ways:
Example #6 Creating new objects
The above example will output:
bool[true] bool[true] bool[true]
It is possible to access a member of a newly created object in a single expression:
Example #7 Access member of newly created object
The above example will output something similar to:
Note: Prior to PHP 7.1, the arguments are not evaluated if there is no constructor function defined.
Properties and methods
Class properties and methods live in separate "namespaces", so it is possible to have a property and a method with the same name. Referring to both a property and a method has the same notation, and whether a property will be accessed or a method will be called, solely depends on the context, i.e. whether the usage is a variable access or a function call.
Example #8 Property access vs. method call
The above example will output:
Extending class a default value
Signature compatibility rules
When overriding a method, its signature must be compatible with the parent method. Otherwise, a fatal error is emitted, or, prior to PHP 8.0.0, an E_WARNING
level error is generated. A signature is compatible if it respects the variance rules, makes a mandatory parameter optional, and if any new parameters are optional. This is known as the
Liskov Substitution Principle, or LSP for short. The constructor, and private
methods are exempt from these signature compatibility rules, and thus won't emit a fatal error in case of a signature mismatch.
Example #11 Compatible child methods