[RESOLVED] Error when trying to implement a Trait

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
xtianos
Forum Newbie
Posts: 14
Joined: Tue Mar 11, 2014 9:35 pm

[RESOLVED] Error when trying to implement a Trait

Post by xtianos »

I am trying to write up a simple MVC framework, mainly to get some practice and to learn more about PHP. I finished writing the main framework controller, which will call the other controllers which will in turn process and subsequently display the requested pages. I created a trait to be used by all controllers that will display a type of "Page Not Found" message. When I try calling the trait from within any class, the interpreter gives me an error message pointing to the class calling the trait. I used CPanel to switch between PHP 5.4 and 5.5; however, I continue to get the same error. I even looked at the tutorial on the PHP Manual website, but unless I am overlooking something I have not been able to find a way to make this work. Any help will greatly be appreciated.

Code: Select all

// Trait file:  PageNotFound.php
<?php
trait PageNotFound {

     public function showPageNotFound(){
          // Code here...
     }

}
?>

// Class file:  MainController.php
<?php
require_once "PageNotFound.php"
class MainController {

     use PageNotFound;

     public function __construct(){}

     // Code here...

?>

$controller = new MainController();
$controller -> showPageNotFound();     // The interpreter cites the use of "USE" as an error within the MainController class.
Last edited by xtianos on Thu Mar 13, 2014 12:28 am, edited 1 time in total.
User avatar
requinix
Spammer :|
Posts: 6617
Joined: Wed Oct 15, 2008 2:35 am
Location: WA, USA

Re: Error when trying to implement a Trait

Post by requinix »

After I added the missing semicolon and closing brace to your code, it worked fine for me.

How about posting your exact code?
xtianos
Forum Newbie
Posts: 14
Joined: Tue Mar 11, 2014 9:35 pm

Re: Error when trying to implement a Trait

Post by xtianos »

requinix,

Thank for the quick reply. The code is below.

Code: Select all

/*
 * This is the main controller class that is called
 * every time the page is accessed. As previously
 * mentioned, this controller calls the others
 * based on the user's request. The file's name is
 * the same as the class name.
*/
<?php
class Controller {

     private $_pageRequest;
     private $_controllersList;
     private $_controllerRequest;

     public function __construct(){}

     protected function _buildControllersList(){
          // Code here...
     }

     protected function _processPageRequest(){
          // Code here...
     }

     public function getControllerRequest(){
          // Code here...
     }

     public function getPageRequest(){
          // Code here...
     }

     public function getControllersList(){
          // Code here...
     }

     final public function execute($defaultController = "Main", $defaultPage = "showPageNotFound"){
          // Code here...
          require_once CONTROLLER_PATH . "/" . $defaultController . ".php";
          call_user_func(array(new $defaultController(), $defaultPage));
     }

}
?>

/*
 * This is the controller called by the controller
 * defined above. Like before, the name of this 
 * new controller is the same as the class. 
*/
<?php
require_once "/home/username/framework/models/traits/PageNotFound.php";
class Main {

     use PageNotFound;

     public function __construct(){}

     public function LoginPage(){
          // Code here...
     }

     public function LogoutPage(){
          // Code here...
     }

}
?>

/*
 * The trait referenced above. Like the two classes above,
 * the name of the trait is the same as the name of the file.
*/
<?php
trait PageNotFound {

     public function showPageNotFound(){
          echo "Trait::PageNotFound.";
     }

}
?>
User avatar
requinix
Spammer :|
Posts: 6617
Joined: Wed Oct 15, 2008 2:35 am
Location: WA, USA

Re: Error when trying to implement a Trait

Post by requinix »

And the other file? You know, the one that actually has the problem?
xtianos
Forum Newbie
Posts: 14
Joined: Tue Mar 11, 2014 9:35 pm

Re: Error when trying to implement a Trait

Post by xtianos »

Below is the index.php file. As previously mentioned, I am trying to figure out what is missing because by studying the code I cannot come up with the answer. I have re-written the whole code at least three times and still cannot figure it out. The message I keep getting when the index file runs is that an unexpected USE is being used, followed by the path of the file and the line where the USE is located/called. Basically, when the index file runs, the error message always points out to the class using the trait, in this case Main. I am wondering if there is something that needs to be changed with the php.ini file or perhaps at the ISP, other than that I do not know what else to do to figure this one out. Thanks for taking the time.

Code: Select all

<?php
require_once "/home/username/framework/controller/Controller.php";
$controller = new Controller();
$controller -> execute();
?>
User avatar
requinix
Spammer :|
Posts: 6617
Joined: Wed Oct 15, 2008 2:35 am
Location: WA, USA

Re: Error when trying to implement a Trait

Post by requinix »

Alright. I'll try one more time:

Please post the exact, entire contents of the MainController and/or Controller class's file.
xtianos
Forum Newbie
Posts: 14
Joined: Tue Mar 11, 2014 9:35 pm

Re: Error when trying to implement a Trait

Post by xtianos »

Code: Select all

// The index file.
<?php
// Framework constants
define("FRAMEWORK_PATH", "/home/username/framework");
define("CONTROLLER_PATH", FRAMEWORK_PATH . "/controller");
define("MODELS_PATH", FRAMEWORK_PATH . "/models");
define("VIEWS_PATH", FRAMEWORK_PATH . "/views");

require_once CONTROLLER_PATH . "/Controller.php";
$controller = new Controller();
$controller -> execute();
?>

// The Controller file.
<?php
class Controller {

	private $_pageRequest;
	private $_controllersList;
	private $_controllerRequest;

	public function __construct(){
		$this -> _processPageRequest();
		$this -> _buildControllersList();
	}

	protected function _buildControllersList(){
		$controllers = scandir(CONTROLLER_PATH);
		$this -> _controllersList = array_slice($controllers, 2);
	}

	protected function _processPageRequest(){
		$uriArray = explode("/", $_SERVER["REQUEST_URI"]);
		$cleanRequest = array();
		foreach($uriArray as $value){
			if(!empty($value)){
				$cleanRequest[] = $value;
			}
		}
		$this -> _controllerRequest = $cleanRequest[0];
		$this -> _pageRequest = $cleanRequest[1];
	}

	public function getControllerRequest(){
		return $this -> _controllerRequest;
	}

	public function getPageRequest(){
		return $this -> _pageRequest;
	}

	public function getControllersList(){
		return $this -> _controllersList;
	}

	public function execute($defaultController = "Main", $defaultPage = "PageNotFound"){
		if(empty($this -> _controllerRequest)){
			require_once CONTROLLER_PATH . "/" . $defaultController . ".php";
			call_user_func(array(
				new $defaultController(),
				"LoginPage"));
		}else if(in_array(
			$this -> _controllerRequest . ".php",
			$this -> _controllersList)){
				require_once CONTROLLER_PATH . "/" . $this -> _controllerRequest . ".php";
				$controller = new $this -> _controllerRequest();
				if(method_exists(
					$controller,
					$this -> _pageRequest)){
						call_user_func(array(
							$controller,
							$this -> _pageRequest));
				}else{
					call_user_func(array(
						new $defaultController(),
						$defaultPage));
				}
		}else{
			require_once CONTROLLER_PATH . "/" . $defaultController . ".php";
			call_user_func(array(
				new $defaultController(),
				$defaultPage));
		}
	}

}
?>

// The Main controller file.
<?php
require_once "/home/username/framework/models/traits/PageNotFound.php";
class Main extends Controller {

	use PageNotFound;

	public function __construct(){
		
	parent::__construct(){}

	/*
	public function PageNotFound(){
		echo "Main::Page Not Found.";
	}
	*/

	public function LoginPage(){
		echo "Main::Login page.";
	}

	public function LogoutPage(){
		echo "Main::Logout Process complete.<br />";
		$this -> LoginPage();
	}

	public function execute(){
		if(method_exists($this, $this -> getPageRequest())){
			echo $this -> getControllerRequest() . "::" . $this -> getPageRequest();
		}
	}

}
?>

// The PageNotFound trait file.
<?php
trait PageNotFound {

	public function PageNotFound(){
		echo "Trait::PageNotFound.";
	}

}
?>
The error message on the browser:
Parse error: syntax error, unexpected T_USE, expecting T_FUNCTION in /home/username/framework/controller/Main.php on line 5
User avatar
requinix
Spammer :|
Posts: 6617
Joined: Wed Oct 15, 2008 2:35 am
Location: WA, USA

Re: Error when trying to implement a Trait

Post by requinix »

Just noticed you've been posting multiple files in the same code block.

Are you sure you're using PHP 5.4+? What does phpinfo() say?
xtianos
Forum Newbie
Posts: 14
Joined: Tue Mar 11, 2014 9:35 pm

Re: Error when trying to implement a Trait

Post by xtianos »

requinix,

The phpinfo() showed the problem, although CPanel was allowing me to set the PHP version to 5.5, somehow the server continued to handle all .php files with version 5.3. I do not understand how this happened because I was using 5.4 until a few months ago when 5.5 became a stable version and available on my ISP. Anyway, I placed a trouble ticket with my ISP so they can look into this because other people may have been or are experiencing a similar problem.

Thank you very much for taking the time to answer my post. Cheers! :D
Post Reply