Question

Let me start off by saying I'm an intermediate level PHP coder who's learning OOP. I've got a site running, but I would like to break my code up to implement a more flexible design pattern...and because OOP is just plain awesome.

In my original code, I used switch statements to call functions that correspond with the user request.

$request = (string) $_GET['fruit'];
switch ($request) {
    case 'apply':
        Get_Apple();
    default:
        Error_Not_A_Fruit();
        exit;
}

This makes it highly inflexible and requires me to change the code at multiple locations for adding new options the user may request.

I'm thinking about changing it to a Polymorphic class call. I'm using composer, so I've got my Objects setup to autoload with PSR-4 standards. So the answer seems simple, if the user request is "apple," I could create

$request = (string) $_GET['fruit'];
$product = new Product\$request;

But, if a user manually enters something that doesn't exists...say "orange," what method would I use to white list the user's input? Like I said, this is my first venture into OOP and would love to pick up design standards that you guys use. I'm thinking encapsulating the block inside a try{} & catch(){} block, but is that the way it should be done?

Any advise would be greatly appreciated :)

Cheers, Niro

Update: I'd like to make it clearer because it may not have been before. I'm looking for the approach to doing this in such a way that one could add new Objects of Subclass Product (implementing a Product Interface). That way I can add different Product types without changing code everywhere.

Was it helpful?

Solution

Well, you can always use class_exist('Product\\Apple').

class_exists takes 2 arguments:

  1. Class Name (full, with namespace)
  2. Boolean value, whether to try and autoload the class or not. Default is true.

The function returns a boolean.

So you write

$fullClassName = "Product\\$request";
if(class_exists($fullClassName )) {
    $product = new $fullClassName();
}
else {
    //error here
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top