Monday, May 21, 2012

PHP - Proper way to extend class

I am currently working on a mini 'framework' and I am having some difficulties. I'm attempting this in order to strengthen my understanding of basic concepts utilized in most MVC's (At least from what I have seen). So yes, I do understand that using a framework may be easier and not everything that I am doing is ideal. I am just trying to learn more.



So I have 2 files that I am currently working with.



FrontController.php



<?php   
class FrontController {
public function __construct() {
$this->go(); // RUNS GO FUNCTION UPON LOADING
}

public function go() {
$url = $_SERVER['REQUEST_URI']; // GRABS URL
$action = explode("/", $url); // SPLITS UP URL INTO SECTIONS

$object = ucfirst($action[2]) . "Controller"; // SETS 2ND SECTION OF URL TO UPPERCASE AND IDENTIFIES THE CONTROLLER
$file = APP_DIR . "/" . $object . ".php"; // IDENTIFIES THE FILE THAT WILL BE USED

if(!is_file($file)){ // DETERMINES IF FILE EXISTS
$this->fail(); // IF NOT, FAILS
} else {
require_once $file; // IF EXISTS, PULLS IT IN
$method = ucfirst($action[3]); // THE 3RD SECTION OF THE URL IS THE METHOD
$controller = new $object(); // CREATE INSTANCE OF THE IDENTIFIED OBJECT

if(!method_exists($controller, $method)){ // DETERMINES IF METHOD EXISTS IN THE CLASS
$this->fail(); // IF NOT, FAILS
}

$controller->$method(); // RUN METHOD
exit(0);
}
}

public function fail() {
echo "<h1>Failure</h1>"; // FAILURE MESSAGE
}
}


/application/BaseController.php



<?php   
class BaseController {
public function __construct() {
$this->session();
}

public function session() {
session_start();
$_SESSION['is_logged_in'] = 1;
echo "hi";
}
}


So what I would like to be able to do is extend the BaseController with the FrontController. I figured that extending the BaseController would allow me to add common functionality to my entire application. The problem is that I am not certain how to do this properly. I know that I need to 'require' BaseController.php into FrontController.php somehow, but I have seen many different ways and I want to know which is most correct.



What I have tried is simply adding 'require_once("/application/BaseController.php");' to the top of FrontController.php and then extending the FrontController class, but this isn't working (blank page), and from what I have read, it is not the best way.



I read into __autoload() but I do not understand how to use it effectively. Do I just put this at the top of my FrontController.php file and extend my class after that?



So, to summarize, I would like to extend my FrontController class (and other future classes, when necessary) with my BaseController. I would just like some advice for how to accomplish this task effectively. It may even be possible that the way I have this thought out is ass backwards, and if that is the case, please let me know!!





No comments:

Post a Comment