Praful Kumar Web page - OOPS With PHP

Object Oriented Programming in PHP





In my opinion any OOP language should have:

Abstract data types and information hiding



This can all be done using PHP classes:



class Something {


var $x;

function setX($v) {

// Methods start in lowercase then use lowercase to separate

// words in the method name example getValueOfArea()



function getX() {

return $this->x;







Object Oriented Programming in PHP - Data Members and Functions


Data members are defined in PHP using a "var" declaration inside the class and they have no type until they are assigned a value. A data member might be an integer, an array, an associative array or even an object.




You create an object using the new operator:


$obj=new Something;

Then you can use member functions like:



The setX member function assigns 5 to the x data member in the object obj (not in the class), then getX returns its value; 5 in this case.


You can access the data members from the object reference using for example: $obj->x=6. However, this is not a very good OOP practice.


I encourage you to set data members by defining methods to set them and access the data members by using retrieving methods.


You'll be a good OOP programmer if you consider data members inaccessible and only use methods from the object handler. Unfortunately PHP doesn't have a way to declare a data member private so bad code is allowed.




Inheritance is easy in PHP using the extends keyword:



class Another extends Something {

var $y;

function setY($v) {

// Methods start in lowercase then use uppercase initials to

// separate words in the method name example getValueOfArea()



function getY() {

return $this->y;





Objects of the class "Another" now have all the data members and methods of the parent class (Something) plus its own data members and methods.

You can use:

$obj2=new Something;




Multiple-inheritance is not supported so you can't make a class extend two or more different classes.


You can override a method in the derived class by redefining it. If we redefine getX in "Another" we can no longer access method getX in "Something".


If you declare a data member in a derived class with the same name as a data member in a Base class the derived data member "hides" the base class data member when you access it.


Object Oriented Programming in PHP - Constructors


You might define constructors in your classes; constructors are methods with the same name as the class and are called when you create an object of the class, for example:



class Something {

var $x;

function Something($y) {



function setX($v) {



function getX() {

return $this->x;





So you can create an object using:

$obj=new Something(6);


...and the constructor automatically assigns 6 to the data member x.


Constructors and methods are normal PHP functions so you can use default arguments.


function Something($x="3",$y="5");







Default arguments are used in the C++ way so you can't pass a value to Y and let X take the default value. Arguments are assigned from left to right and when no more arguments are found if the function expected more they take the default values.


When an object of a derived class is created only its constructor is called the constructor of the Parent class is not called.


This is a gotcha of PHP because constructor chaining is a classic feature of OOP, if you want to call the base class constructor you have to do it explicitly from the derived class constructor.





function Another() {






Abstract Classes


A nice mechanism in OOP is the use of Abstract Classes; abstract classes are classes that cannot be instantiated and the only purpose is to define an interface for its derived classes.


Designers often use Abstract classes to force programmers to derive classes from certain base classes, so they can be certain that the new classes have some desired functionality.


There's no standard way to do that in PHP but, if you do need this feature, just define the base class and put a "die" call in its constructor so you can be sure that the base class is never instantiated.


Now define the methods (interface) putting "die" statements in each one so if in a derived class a programmer doesn't override the method then an error is raised.


Furthermore you might need to be sure, since PHP has no types, that some object is from a class derived from your base class, then add a method in the base class to identify the class (return "some id") and verify this when you receive an object as an argument.


Of course this doesn't work if the evil programmer overrides the method in the derived class but generally the problem is dealing with lazy programmers not evil ones! Of course it’s better to keep the base class unreachable from the programmers, just print the interface and make them work!


There're no destructors in PHP.


Object Oriented Programming in PHP - Overloading


Overloading (which is different from overriding) is not supported in PHP. In OOP you "overload" a method when you define two/more methods with the same name but different number or type of parameters (depending upon the language).


PHP is a loosely typed language so overloading by types won't work, however overloading by number of parameters doesn't work either.





class Myclass {

function Myclass() {






function Myclass1($x) {



function Myclass2($x,$y) {








$obj1=new Myclass('1'); //Will call Myclass1

$obj2=new Myclass('1','2'); //Will call Myclass2


Sometimes this is very nice.



Polymorphism is defined as the ability of an object to determine which method to invoke for an object passed as argument in runtime time. For example if you have a class figure which defines a method draw and derived classes circle and rectangle, where you override the method draw you might have a function which expects an argument x and then call $x->draw().




Polymorphism is very easy and natural in interpreted languages as PHP (try to imagine a C++ compiler generating code for this case, which method do you call? You don't know yet which type of object you have! OK, this is not the point).


So PHP happily supports polymorphism.



function niceDrawing($x) {

//Supose this is a method of the class Board.



$obj=new Circle(3,187);

$obj2=new Rectangle(4,5);






Object Oriented Programming in PHP - OOP Programming in PHP




For large projects, however, you might want/need to use "pure" OOP in PHP declaring classes and using only objects and classes for your project.

As larger and larger projects emerge the use of OOP may help.


OOP code is easy to maintain, easy to understand and easy to reuse. Those are the foundations of software engineering. Applying those concepts to web based projects is the key to success in future web sites.


Advanced OOP Techniques in PHP






PHP doesn't support persistent objects; in OOP persistent objects are objects that keep its state and functionality across multiple invocations of the application. This means having the ability to save the object to a file or database and then load the object back. The mechanism is known as serialization.


PHP has a serialize method which can be called for objects, the serialize method returns a string representation of the object. However serialize saves the data members of the object but not the methods.

In PHP4 if you serialize the object to string $s, then destroy the object, then unserialize the object to $obj you might still access the object methods! I don't recommend this because:

The documentation doesn't guarantee this behaviour so in future versions it might not work.

This might lead to 'illusions' if you save the serialized version to disk and exit the script. In future runs of the script you can't unserialize the string to an object and expect the methods to be there because the string representation doesn't have the methods.

You can serialize associative arrays and arrays to save them to disk too.




$obj=new Classfoo();


// Save $str to disk

//...some months later

//Load str from disk




You have the data members recovered but not the methods (according to the documentation). This leads to $obj2->x as the only way to access the data members (you have no methods) so don't try this at home.


There're some ways to fix the problem but I leave it up to you because they are too dirty for this neat article. Full serialization is a feature I'd gladly welcome in PHP.


Using Classes to Manipulate Stored Data


One very nice thing about PHP and OOP is that you can easily define classes to manipulate certain things and the call the appropriate classes whenever you want.


Suppose you have a HTML form where the user selects a product by selecting its product ID, you have the data of the products in a database and you want to display the product, show its price, etc. You have products of different types and the same action might have different meanings for different kind of products.




Define a class product, define which methods the class should have (example display), then define classes for each type of product which extends the product class (class SoundItem, class ViewableItem, etc.), override the methods you define in product in each of this classes make them do what you want. Name the classes according to the "type" column you store in the database for each product a typical product table might have (id, type, price, description, etc.).


Then in the processing script you can retrieve the type from the database and instantiate an object of the class named type using:



$obj=new $type();








Do you agree programming is easy, maintenance is cheaper and reusability is real now?


If you command a group of programmers it's easy to divide the tasks, each one might be responsible for a type of object and the class that handles it. Internationalization can be done using this technique, apply the proper class according to a language field selected by the user, etc.


Object Oriented Programming in PHP - Copying and Cloning




Sometimes you don't want this you just want to create a new object of the same class as obj, calling the constructor of the new object as if you had used the new statement.




Entering a Danger Zone

When you serialize an object you get a string which has a certain format, you may investigate this if you are curious. One of the things the string has is the name of the class (nice!), you can extract it using:








So suppose you create a class "Universe" and force that all classes must extend universe, you can define a method clone in Universe as:



class Universe {

function clone() {




$ret=new $nam;

return $ret;





$obj=new Something();

//Something extends Universe !!




What you get is a new object of class Something created the same way as using new; the constructor is called, etc. I don't know if this is useful for you but the Universe class which knows the name of the derived class is a nice concept to experiment with. The only limit is your imagination.


Note: I'm using PHP4, some of these examples may not work in PHP3.

Today, there have been 104009 visitors (306326 hits) on this page!