PHP: Real world OOP example

PhpOop

Php Problem Overview


I am trying to learn OOP. The so called 'real world' examples in the books I am reading aren't helping.

All the examples like Pet, Car, Human aren't helping me anymore. I need REAL LIFE examples that like registration, user profile pages, etc.

An example:

$user->userName = $_POST['userName'];//save username
$user->password = $_POST['password'];//save password
$user->saveUser();//insert in database

I've also seen:

$user->user = (array) $_POST;

where :

private $user = array();

Holds all the information in an array.

And within that same class lies

$user->getUser($uid);
// which sets the $this->user array equal to mysqli_fetch_assoc() using 
//the user id.

Are there any real world examples implementing OOP in the many different php applications (registration, login, user account, etc)?

Php Solutions


Solution 1 - Php

OOP is not only about how a single class looks and operates. It's also about how instances of one or more classes work together.

That's why you see so many examples based on "Cars" and "People" because they actually do a really good job of illustrating this principle.

In my opinion, the most important lessons in OOP are encapsulation and polymorphism.

Encapsulation: Coupling data and the logic which acts on that data together in a concise, logical manner Polymorphism: The ability for one object to look-like and/or behave-like another.

A good real-world example of this would be something like a directory iterator. Where is this directory? Maybe it's a local folder, maybe it's remote like an FTP server. Who knows!

Here's a basic class tree that demonstrates encapsulation:

<?php

interface DirectoryIteratorInterface
{
    /**
     * @return \Traversable|array
     */
    public function listDirs();
}

abstract class AbstractDirectoryIterator implements DirectoryIteratorInterface
{
    protected $root;

    public function __construct($root)
    {
        $this->root = $root;
    }
}

class LocalDirectoryIterator extends AbstractDirectoryIterator
{
    public function listDirs()
    {
        // logic to get the current directory nodes and return them
    }
}

class FtpDirectoryIterator extends AbstractDirectoryIterator
{
    public function listDirs()
    {
        // logic to get the current directory nodes and return them
    }
}

Each class/object is responsible for its own method of retrieving a directory listing. The data (variables) are coupled to the logic (class functions i.e, methods) that use the data.

But the story is not over - remember how I said OOP is about how instances of classes work together, and not any single class or object?

Ok, so let's do something with this data - print it to the screen? Sure. But how? HTML? Plain-text? RSS? Let's address that.

<?php

interface DirectoryRendererInterface
{
    public function render();
}

abstract class AbstractDirectoryRenderer implements DirectoryRendererInterface
{
    protected $iterator;

    public function __construct(DirectoryIteratorInterface $iterator)
    {
        $this->iterator = $iterator;
    }

    public function render()
    {
        $dirs = $this->iterator->listDirs();
        foreach ($dirs as $dir) {
            $this->renderDirectory($dir);
        }
    }

    abstract protected function renderDirectory($directory);
}

class PlainTextDirectoryRenderer extends AbstractDirectoryRenderer
{
    protected function renderDirectory($directory)
    {
        echo $directory, "\n";
    }
}

class HtmlDirectoryRenderer extends AbstractDirectoryRenderer
{
    protected function renderDirectory($directory)
    {
        echo $directory, "<br>";
    }
}

Ok, now we have a couple class trees for traversing and rendering directory lists. How do we use them?

// Print a remote directory as HTML
$data = new HtmlDirectoryRenderer(
  new FtpDirectoryIterator('ftp://example.com/path')
);
$data->render();

// Print a local directory a plain text
$data = new PlainTextDirectoryRenderer(
  new LocalDirectoryIterator('/home/pbailey')
);
$data->render();

Now, I know what you're thinking, "But Peter, I don't need these big class trees to do this!" but if you think that then you're missing the point, much like I suspect you have been with the "Car" and "People" examples. Don't focus on the minutiae of the example - instead try to understand what's happening here.

We've created two class trees where one (*DirectoryRenderer) uses the other (*DirectoryIterator) in an expected way - this is often referred to as a contract. An instance of *DirectoryRenderer doesn't care which type of instance of *DirectoryIterator it receives, nor do instances of *DirectoryIterator care about how they're being rendered.

Why? Because we've designed them that way. They just plug into each other and work. This is OOP in action.

Solution 2 - Php

Purchase a book like "PHP and Mysql everyday apps for Dummies".

Its old I know [2005] but it shows concepts of User Logins, Forum, Shopping Carts, etc in both Procedural and Object Oriented with Mysqli.

It helped me learn Object Oriented PHP, I studied it a lot. Well worth the money.

OOP is much like grouping bits of your program into reuseable pieces. Its not that hard to be honest with you its just the idea of packing your functions into classes.

Real world mini example of OOP stuff below:

CLASS DATABASE
CLASS SESSIONS
CLASS WEBFORMS
CLASS EMAIL

CLASS ACCOUNTS (Example Functions below)
FUNCTION SELECTACCOUNT
FUNCTION CHECKPASSWORD
FUNCTION CHECKUSERNAME
FUNCTION CREATEACCOUNT

I hope you keep at it, PHP 6 will be re-engineered to support OOP more than ever.

Good Luck!

Solution 3 - Php

Whilst I know that this question has been answered already, I feel as though I can add value here.

I don't believe that you should use PHP as a programming language to learn OOP. If you wish to learn OOP for web applications, you should really be looking at C# or Java. Once you have learned OOP, then you can apply this knowledge to PHP. One example of a book I used to learn OOP was Big Java by Cay S. Horstmann

Why do I say this??? Because there are literally millions of examples on PHP of how to do stuff, however not many are examples of how to program properly. Further to this, PHP allows you to take many shortcuts, which would not be acceptable with the likes of Java. As such, if you program PHP with a Java head, then I believe that you will be a stronger programmer. OOP is not language specific, it is a programming paradigm.

If you must learn OOP using PHP, then I would recommend that you take a look at some real source code in public repositories of github. You can search them in packagist.org. If they are a decent public repository, they will contain a readme.md file which would show you how to use the composer packages. e.g https://github.com/moltin/laravel-cart is an example of a shopping cart package which you would be able to use in your application. Notice how you don't need to look at the package source code to understand what the packages do. The package has been written, and you don't care about how they work, but you use them so you only need to know how to use them. This is exactly what OOP is about.

> I don't care how the shopping cart class adds an item to the cart, I just want to create a new cart and add something to it.

What you are doing however is diving into the source code as a tool to understand how OOP works.

Further to this, and probably more importantly, for web application development, I would research the MVC design pattern.

The MVC design Pattern stands for Model, View, Controller. Where in the case of a web application, The Model is responsible for modelling the database, the view is responsible for displaying content to the user. The controller is responsible for interacting with the model and handling user input.

I then think you should try to install the Laravel Framework or other "decent modern framework" on your local machine. Why do I say modern, because modern frameworks require a minumum PHP version of 5.3+ which mean that the PHP on your machine would support real OOP similar to that which you would get from the likes of Java.

There are many tutorials which will show you how to build web applications in laravel. Immediately, you will see that when you create a controller, you extend a BaseController. When you create a Model, you extend Eloquent. This means that you will already be using Polymorphism in your code. You will see that by using classes, they are being encapsulated, and you will see that each class has a specific role.

When you would like to interact with the database, you will initially create a new Model object within the controller methods. As you start to learn more, you will start learning how to inject dependencies into the controller, then learning how to dump your models and create repositories and program to interfaces instead.

A decent book on learning Laravel for beginners would be https://leanpub.com/codebright by Dale Rees. I met Dale at a Laravel meetup about 2 weeks ago.

Further to this, as you become more proficient building web applications, you will start to learn how to apply the following principles to your programming:

  • Single Responsibility Principle
  • Open Closed Principle
  • Liskov Substitution Principle
  • Interface Segragation Principle
  • Dependency Inversion Principle

Solution 4 - Php

As astropanic said, you could take a look at the source code of a good PHP framework or library. I recommend [Zend Framework][1], it's very modular and has a great, professional design. I would say it is a very good piece of object-oriented PHP code.

Still, I think it's not that easy to learn from a huge piece of production code, since it wasn't really made to teach you anything. But if you want real-world object-oriented PHP code, the Zend Framework (or Symfony, or maybe CakePHP) is probably the way to go.

[1]: http://framework.zend.com/ "Zend Framework"

Solution 5 - Php

I'd advise you to stay away from any framework at this moment, if you do not know OOP, digging into zend or any other framework would be too much.

PHP OOP is quit funny... like ha ha funny, because it's supported, but PHP is not an OOP language like java or c#.

Short example just to underline my statement:

// define class
class User {
// define properties and methods
public $name = "";
}
// instantiate class
$user = new User; // or new User() or new user, it's all the same
echo $user->name;

but if you want to do OOP "on the fly" you can do the following:

$user = (object) array('name' => 'Peter');

and then

$user->name;

but you can use OOP like you would in java or c# but not to the same extend - and have in mind, popular systems like wordpress and drupal are not pure OOP! but you can do inheritance and other classing OOP stuff in PHP as well.

Solution 6 - Php

I haven't gone far in PHP OOP, but the more i get into it the more easier it becomes. The objects examples are just there for you to understand how OOP works. I understand and been through this before, OOP is just about properties and methods ( normal variables and functions). I programed in real OOP myself applying the examples from my tutorials and didn't necessarily have to be in real world. That is just like been spoon fed and you would never understand OOP and would be easy to forget. My advice learn to understand. If you understand, you can do anything and would realize the power of OOP. I downloaded this book and i think you should too. But that is just like someone building your apps for you...

Here a link to the book PHP and Mysql everyday Apps For Dummies

Solution 7 - Php

you're right 99% of the tutorials that you'll find online are too basic, and they don't make sense. My suggestion to anybody trying to learn object oriented programming is:

find some code that you've written in procedural programming and try to convert it into OOP.

Take all your variables and make them a properties of a class, find a suitable class name. Then take all your functions, if you have functions, and group them within a class. If you wrote your code without using functions, first try to convert your code into a group of functions. find suitable function names, a function should define what a piece of code does. Once you have your functions move them into a class.

I'll give you a simple example of a pagination code that I converted into a reusable pagination class. find the full tutorial on youtube: https://www.youtube.com/watch?v=X38IRlyY_ww&t=91s , link to the source code is on the description box

class Paginator{

    /*the class need to know the current page to calculate the offset
       the offset tell my sql how many rows to skip */
   private $current_page;
   //the limit is the number of results to display per page
   private $limit;
   /*pagination links to display below the results with next 
   and previous button*/
   private $pagination_links;
   //the last page of your pagination links 
   private $last_page;
   .
   . etc

    public function __contruct($number_of_rows_found,$results_to_display_per_page){

      //the paginator uses the number_of_rows_found to determine the last page 
       $this->last_page = $number_of_rows_found/$results_to_display_per_page;
          //get the current page, set it to 1 by default
         $this->current_page = isset($_GET['page']) ? ($_GET['page'] : 1;

    }

   public function generate_pagination_links(){ 
          this method uses the last_page property to generate pagination links
           if the last page is 3, this will give you 3 pagination links
         for ($page = 1; $page <= $this->last_page; $page++) {
            //use
         }
   }
public function get_offset_and_limit(){
     //this method calculates the offset based on the current page
      return "LIMIT $this->per_page OFFSET ".($this->page - 1) * $this->per_page;
 }
.
.
.etc
}
}

Then to use the pagination class, you create a new instance of it, and pass the number of results you want to display per page, and the the number of results returned by your query as parameters. The pagination class will generate pagination links for you and calculate the offset and limit. That's a good example of a php reusable class, you can use it in your multiple projects without having to rewrite or change it.

$paginator = New Paginator($rows_found,8);
    $pagination_links = $paginator->get_pagination_links();

    $offset_and_limit =  $paginator->get_offset_and_limit();

    //apend the limit and offset to your sql query
    $query = $query. ' '.$offset_and_limit;

    $connection = getdbconnection();
    $stmt = $connection->prepare($query);
    $stmt->execute();
    $movies = $stmt->fetchAll();

Ofcourse there're more advanced concepts into OOP that are not covered in this example, but this should give you a basic understanding of how classes and objects work

Solution 8 - Php

I suggest also to see my wrapper Arrayzy. It's a native PHP arrays easy manipulation library in OOP way.

So if you work with native PHP array functions - you could do the same things in OOP and Arrayzy helps you with it, for example:

// Functional programming:
$array = ['a', 'b', 'c'];
$resultArray = array_merge($array, ['c', 'd']);

and

// Object-oriented programming:
$obj = Arrayzy\MutableArray::create(['a', 'b', 'c']);
$obj->mergeWith(['c', 'd']);
$resultArray = $obj->toArray();

In both cases the result array will be:

Array(
    0 => 'a'
    1 => 'b'
    2 => 'c'
    3 => 'c'
    4 => 'd'
)

Check how does this mergeWith method (or other) works under the hood.

I think this is a nice example which shows that almost everything functional code you could replace with OOP code like in this library. But with OOP you get much more and you could also check Functional programming vs OOP question to learn more details what's a cons and props of it.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBDuelzView Question on Stackoverflow
Solution 1 - PhpPeter BaileyView Answer on Stackoverflow
Solution 2 - PhpRockyBalboaView Answer on Stackoverflow
Solution 3 - PhpGravyView Answer on Stackoverflow
Solution 4 - PhpmoowareView Answer on Stackoverflow
Solution 5 - Phpkristian nissenView Answer on Stackoverflow
Solution 6 - PhpblakrokuView Answer on Stackoverflow
Solution 7 - PhpInno the tech geekView Answer on Stackoverflow
Solution 8 - PhpVictor BocharskyView Answer on Stackoverflow