PHP implements encapsulation, one of the important principles of OOP with access control keywords: public, private and protected. Encapsulation refers to the mechanism of keeping the data members or properties of an object away from the reach of the environment outside the class, allowing controlled access only through the methods or functions available in the class. The following diagram illustrates the principle of encapsulation in object-oriented programming methodology. PHP’s keywords list contains the following keywords that determine the accessibility of properties and methods of an object, which is an instance of a class in PHP − These three keywords “public, private and protected” are often called access modifiers. They are also referred as visibility modes, as they decide upto what extent a certain class member is available. Public Members In PHP, the class members (both member variables as well as member functions) are public by default. Example In the following program, the member variables title and price of the object are freely accessible outside the class because they are public by default, if not otherwise specified. Open Compiler It will produce the following output − Note that the properties all the class members are public by default, you can explicitly declare them as public if desired. As a result, the instance methods getName() and getAge() can be called from outside the class. Since properties name and age are also public, hence they can also be accessed outside the class, something which is not desired as per the principle of encapsulation. Private Members As mentioned above, the principle of encapsulation requires that the member variables should not be accessible directly. Only the methods should have the access to the data members. Hence, we need to make the member variables private and methods public. Example Let us change the declaration of name and age properties to private and run the following PHP script − Open Compiler It will produce the following output − The error message tells the reason that a private property cannot be accessed from a public scope. Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career. Protected Members The effect of specifying protected access to a class member is effective in case of class inheritance. We know that public members are accessible from anywhere outside the class, and private members are denied access from anywhere outside the class. The protected keyword grants access to an object of the same class and an object of its inherited class, denying it to any other environment. Example Let us inherit the person class and define a student class. We shall change the name property from private to protected. The student class has a new public method getDetails() that prints the values of name and age properties. Person class Student class classstudentextendsPerson{publicfunctiongetDetails(){echo”My Name: $this->name”.PHP_EOL;echo”My age: $this->age”.PHP_EOL;}}$s1=newstudent();$s1->getDetails();?> It will produce the following output − The following table illustrates the rules of accessibility of class members in PHP −
Object Iteration
A foreach loop may be employed to iterate through all the publicly visible members of an object of a PHP class. This feature has been available in versions of PHP 5 onwards. You can of course access the list of private properties inside an instance method. PHP also defines Iterator interface which can be used for the purpose. Using foreach Loop In the example below, the public properties of the class are listed with the use of foreach loop. Example Open Compiler It will produce the following output − Note that only the public members are accessible outside the class. If the class includes a method, all the members (public, private or protected) can be traversed with a foreach loop from inside it. Let us add an iterate method in the above myclass. Call this instance method to get the list of all the members. It will produce the following output − Using Iterator Interface PHP provides Iterator interface for external iterators or objects that can be iterated themselves internally. It defines following abstract methods which need to be implemented in the user defined class. Example The following example demonstrates object iteration by implementing Iterator interface Open Compiler It will produce the following output −
Namespaces
We often organize the files in different folders. Usually a folder contains files related to a certain objective, or application or category. A folder can’t contain two files with the same name, though different folders may have a file of the same name so that the path of each file is different. The idea of namespaces in PHP is somewhat similar. In PHP, namespaces allow classes or functions or constants of same name be used in different contexts without any conflict, thereby encapsulating these items. A PHP namespace is logical grouping of classes/functions etc., depending on their relevance. Just as a file with same name can exist in two different folders, a class of a certain name can be defined in two namespaces. Further, as we specify the complete path of a file to gain access, we need to specify full name of class along with namespace. As your application size becomes bigger, involving many class and function definitions, giving give a unique name to each class/function may become tedious and not exactly elegant. Using namespaces lets you organize such code blocks in a neat manner. For example, if we need to declare a calculate() function to calculate area as well as tax, instead of defining them as something like calculate_area() and calculate_tax(), we can create two namespaces area and tax and use calculate() inside them. Advantages of Namespace Here are some of the advantages of using namespaces in PHP − Defining a Namespace PHP’s namespace keyword is used to define a new namespace. A “.php” file containing a namespace must declare the namespace at the top of the file before any other (except the declare directive). Declaration of class, function and constants inside a namespace affects its access. A PHP script may contain other code apart from the definition of a namespace. To load the namespace defined in the same code, PHP has the “use” keyword. usemyspace; Example In the following “hello.php” script, we define a hello() function inside myspace namespace, and call it after loading the namespace in the current script. Open Compiler It will produce the following output − Note that you must qualify the hello() function with its full name that includes the namespace – myspace\hello(). Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career. Include Namespace You may have one script consisting of a declaration of a namespace, and the other script in which the namespace is loaded with include statement. a.php b.php <?php include ‘a.php’; myspace\hello(); ?> It will produce the following output − Hello World in myspace There may be a case where the current script (“b.php” as above) also has a function of the same name as in the included file. The fully qualified function that prepends the namespace, helps the parser to resolve the name conflict. Example Take a look at the following example − It will produce the following output − Example As mentioned above, the namespace declaration must be at the top, immediately after the opening <?php tag. Otherwise the parser throws a fatal error. Open Compiler It will produce the following output − The above error message makes it clear that only the “declare statement” is allowed to appear before the namespace declaration. Open Compiler Relative Namespace The objects such as functions, classes and constants may be accessed in the current namespace by referring the with relative namespace paths. In the following example, “b.php” contains a namespace space1\myspace with a hello() function and a TEMP constant. The same objects are also defined in namespace space1, present in “a.php”. Obviously, when “b.php” is included in “a.php”, “myspace” is a subspace of “space1”. Hence, hello() from “myspace” is called by prefixing its relative namespace (also the TEMP constant) b.php a.php It will produce the following output − Absolute Namespace You can also access the functions/constants from any namespace by prefixing the absolute namespace path. For example, hello() in “b.php” is “\space\myspace\hello()”. a.php The __NAMESPACE__ is a predefined constant in PHP that returns the name of current namespace. Namespace Rules Any conflict in the names of function/classes/constants appearing between different namespaces is resolved by following these rules −
Static Properties
The “static” keyword in PHP is used to define static properties and static methods in a PHP class. It may be noted that the static keyword is also used to define static variable, and static anonymous functions. Read this chapter to learn about the static properties in a PHP class. In a class definition, a variable declared with a static qualifier becomes its static property. The static keyword may appear before or after the access modifier. If you want to use type hints, the type must not be before the static keyword. The value of the static property in a class is not accessible by its object (with the -> operator). Doing so will result in a notice stating Accessing static property myclass::$var1 as non static. Instead, the static properties are accessed using the Scope Resolution Operator represented by the “::” symbol. Example Take a look at the following example − Open Compiler It will produce the following output − The “self” Keyword To access the static property from inside a method, refer to the current class with the self keyword. In the following example, the class has an integer static property, which is incremented every time a new object is declared. Open Compiler It will produce the following output − Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career. The “parent” Keyword The static property of a base class can be used inside a function of the inherited class by referring to the base by parent keyword. You need to use the “parent::static_property” syntax. Example Take look at the following example − Open Compiler It will produce the following output −
Static Methods
The “static” keyword in PHP is used to define static properties and static methods in a PHP class. It may be noted that the static keyword is also used to define static variable, and static anonymous functions. This chapter discusses static methods in a PHP class. In a class definition, a function declared with a static qualifier becomes its static method. You don’t need to create the instance of the class to call its static method. The static method is called by the class name though the scope resolution operator. The syntax of a static method call is − As the static methods are callable without creating an instance of the class, the pseudo-variable $this is not available inside static methods. A static method is allowed to be called by an object, although calling an instance method as a static method raises error. Example Take a look at the following example − Open Compiler It will produce the following output − The “self” Keyword in Static Method If you need to call a static method from inside an instance method defined in the same class, you have to use self keyword referring to the name of the class, followed by the scope resolution operator (such as self::mystaticmethod) Open Compiler It will produce the following output − Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career. Using the “parent” Keyword In case of inheritance, a static method defined in a base class may be called by an object of derived class, or from inside an instance method of the derived class, by referring it with the “parent” keyword. Example Take a look at the following example − Open Compiler It will produce the following output − Static Method Inside Another Class It is entirely possible to call the static method from one class in another. You have to qualify its name with its class name followed by the scope resolution operator. Example Take a look at the following example − Open Compiler It will produce the following output − Since $this pseudo-variable is not available for a static method, the instance variables of an object cannot be accessed inside a static method. It can process only the static properties of the class. Example Take a look at the following example − Open Compiler It will produce the following output −
Traits
In PHP, a class can inherit only from one parent class, multiple inheritance is not defined in PHP. Traits in PHP have been introduced to overcome this limitation. You can define one or more method in a trait, which can be reused freely in various independent classes. Syntax The “trait” keyword is used as per the following syntax − To be able to call the methods in a trait, it needs to made available to another class with use keyword. Example A Trait is similar to a class, but only intended to group functionality in a fine-grained and consistent way. It is not possible to instantiate a Trait on its own. Open Compiler It will produce the following output − Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career. Example A trait can be used in more than one classes. The following example has a mytrait with avg() function int it. It is used inside a marks class. The percent() method internally calls the avg() function from the trait. Take a look at the following example − Open Compiler It will produce the following output − Using Multiple Traits A class can use more than one traits. Here we have two traits with one function each performing addition and multiplication of two numbers. Both are used inside a third class. Open Compiler It will produce the following output − Overriding Trait Function When a class uses a certain trait, its function are available to it just as a child class inherits the parent methods. The trait function may also be overridden. Open Compiler It will produce the following output − The “insteadof” Keyword Sometimes, more two traits might have same name of the function. Hence, using them in a class creates ambiguous situation. PHP provides insteadof keyword to tell the parser function from which trait you intend to use. Open Compiler It will produce the following output − Aliasing a Trait Function If you want to be able to call functions from both traits even if they have function with same name, a workaround is to specify an alias name to one of them. Example In the following example, we will call sayHello() from mytrait as hello() − Open Compiler It will produce the following output −
Interfaces
Just as a class is a template for its objects, an interface in PHP can be called as a template for classes. We know that when a class is instantiated, the properties and methods defined in a class are available to it. Similarly, an interface in PHP declares the methods along with their arguments and return value. These methods do not have any body, i.e., no functionality is defined in the interface. A concrete class has to implement the methods in the interface. In other words, when a class implements an interface, it must provide the functionality for all methods in the interface. An interface is defined in the same way as a class is defined, except that the keyword “interface” is used in place of class. Note that the methods inside the interface have not been provided with any functionality. Definitions of these methods must be provided by the class that implements this interface. When we define a child class, we use the keyword “extends“. In this case, the class that must use the keyword “implements“. All the methods declared in the interface must be defined, with the same number and type of arguments and return value. Note that all the methods declared in an interface must be public. Example Let us define an interface called shape. A shape has a certain area. You have shapes of different geometrical appearance, such as rectangle, circle etc., each having an area, calculated with different formula. Hence the shape interface declares a method area() that returns a float value. Next, we shall define a circle class that implements shape interface, to implement, the class must provide a concrete implementation of the functions in the interface. Here, the area() function in circle class calculates the area of a circle of a given radius. We can now declare an object of circle class, and call the area() method. An interface can be implemented by any number of classes (which may be unrelated to each other) provided the implementing class provides functionality of each method in the interface. Here is a Square class that implements shape. The area() method returns the square of the side property. Similarly, create a Square object and call the area() method. Example Given below is the complete code for a shape interface, implemented by circle and Square classes − Open Compiler It will produce the following output − Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career. Multiple Inheritance in PHP PHP doesn’t have the provision to build a child class that extends two parent classes. In other words, the statement − is not accepted. However, PHP does support having a child class that extends one parent class, and implementing one or more interfaces. Let use look at the following example that shows a class that extends another and implements an interface. First, the parent class marks. It has three instance variables or properties $m1, $m2, $m3 representing the marks in three subjects. A constructor is provided to initialize the object. We now provide an interface called percent that declares a method percent(), which should return a float but doesn’t have a function body. We now develop a class that extends marks class and provides implementation for percent() method in the interface. The student class inherits the parent constructor, but provides implementation of parent() method that returns the percentage of marks. Example The complete code is as follows − Open Compiler It will produce the following output − The interface in PHP defines a framework of methods that classes use to provide a different but concrete implementation of their own.
Abstract Classes
The list of reserved words in PHP includes the “abstract” keyword. When a class is defined with the “abstract” keyword, it cannot be instantiated, i.e., you cannot declare a new object of such a class. An abstract class can be extended by another class. As mentioned above, you cannot declare an object of this class. Hence, the following statement − will result in an error message as shown below − An abstract class may include properties, constants or methods. The class members may be of public, private or protected type. One or more methods in a class may also be defined as abstract. If any method in a class is abstract, the class itself must be an abstract class. In other words, a normal class cannot have an abstract method defined in it. This will raise an error − The error message will be shown as − You can use an abstract class as a parent and extend it with a child class. However, the child class must provide concrete implementation of each of the abstract methods in the parent class, otherwise an error will be encountered. Example In the following code, myclass is an abstract class with myabsmethod() as an abstract method. Its derived class is mynewclass, but it doesn’t have the implementation of the abstract method in its parent. Open Compiler The error message in such a situation is − It indicates that newclass should either implement the abstract method or it should be declared as an abstract class. Example In the following PHP script, we have marks as an abstract class with percent() being an abstract method in it. Another student class extends the marks class and implements its percent() method. Open Compiler It will produce the following output − Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career. Difference between Interface and Abstract Class in PHP The concept of abstract class in PHP is very similar to interface. However, there are a couple of differences between an interface and an abstract class. Abstract class Interface Use abstract keyword to define abstract class Use interface keyword to define interface Abstract class cannot be instantiated Interface cannot be instantiated. Abstract class may have normal and abstract methods Interface must declare the methods with arguments and return types only and not with any body. Abstract class is extended by child class which must implement all abstract methods Interface must be implemented by another class, which must provide functionality of all methods in the interface. Can have public, private or protected properties Properties cannot be declared in interface
Class Constants
PHP allows an identifier in a class to be defined as a “class constant” with a constant value, the one that remains unchanged on a per class basis. To differentiate from a variable or property within class, the name of the constant is not prefixed with the usual “$” symbol and is defined with the “const” qualifier. Note that a PHP program can also have a global constant created using the define() function. The default visibility of a constant is public, although other modifiers may be used in the definition. The value of a constant must be an expression and not a variable, nor a function call/property. The value of a constant is accessed through the class name using the scope resolution operator. Inside a method though, it can be referred to through self variable. Constant names are case sensitive. Conventionally, the names of constants are in upper case. Example This example shows how a Class Constant is defined and accessed − Open Compiler It will produce the following output − Class Constant as Expression In this example, the class constant is assigned an expression − Open Compiler It will produce the following output − Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career. Class Constant Visibility Modifiers Take a look at the following example − It will produce the following output −
Inheritance
Inheritance is one of the fundamental principles of object-oriented programming methodology. Inheritance is a software modelling approach that enables extending the capability of an existing class to build new class instead of building from scratch. PHP provides all the functionality to implement inheritance in its object model. Incorporating inheritance in PHP software development results in code reuse, remove redundant code duplication and logical organization. Imagine that you need to design a new class whose most of the functionality already well defined in an existing class. Inheritance lets you to extend the existing class, add or remove its features and develop a new class. In fact, PHP has the “extends” keyword to establish inheritance relationship between existing and new classes. Inheritance comes into picture when a new class (henceforth will be called inherited class, sub class, child class, etc.) possesses “IS A” relationship with an existing class (which will be called base class, super class, parent class, etc.). In PHP, when a new class is defined by extending another class, the subclass inherits the public and protected methods, properties and constants from the parent class. You are free to override the functionality of an inherited method, otherwise it will retain its functionality as defined in the parent class. Example Take a look at the following example − Open Compiler It will produce the following output − As mentioned before, the child class inherits public and protected members (properties and methods) of the parent. The child class may introduce additional properties or methods. In the following example, we use the Book class as the parent class. Here, we create an ebook class that extends the Book class. The new class has an additional property – format (indicating ebook’s file format – EPUB, PDF, MOBI etc). The ebook class defines two new methods to initialize and output the ebbok data – getebook() and dispebook() respectively. Example The complete code of inheritance example is given below − Open Compiler The browser output is as shown below − If you take a closer look at the getebook() function, the first two assignment statements are in fact there getbook() function, which the ebook class has inherited. Hence, we can call it with parent keyword and scope resolution operator. Change the getebook() function code with the following − Similarly, the first echo statement in dispebook() function is replaced by a call to the dispbook() function in parent class − Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career. Constructor in Inheritance The constructor in the parent class constructor is inherited by the child class but it cannot be directly called in the child class if the child class defines a constructor. In order to run a parent constructor, a call to parent::__construct() within the child constructor is required. Example Take a look at the following example − Open Compiler It will produce the following output − However, if the child does not have a constructor, then it may be inherited from the parent class just like a normal class method (if it was not declared as private). Example Take a look at the following example − Open Compiler It will produce the following output − PHP doesn’t allow developing a class by extending more than one parents. You can have hierarchical inheritance, wherein class B extends class A, class C extends class B, and so on. But PHP doesn’t support multiple inheritance where class C tries to extend both class A and class B. We can however extend one class and implement one or more interfaces. We shall learn about interfaces in one of the subsequent chapters.