As I expressed in the section that you just read, I’d like to finish discussing the use of private methods in PHP 5 by coding yet another demonstrative example. In this particular case, I want you to see for yourself what happens when a private method defined by a parent is invoked by one of its child classes. So take a look at the following code sample to dissipate any possible doubts: // define 'DataSaver' class (methods are defined private) class DataSaver{ protected $filePath; protected $data; public function __construct($data,$filePath){ if(!$data||strlen($data)>1024){ throw new Exception('Invalid data for being saved to target file.'); } if(!file_exists($filePath)){ throw new Exception('Invalid target file.'); } $this->data=$data; $this->filePath=$filePath; } // save data to target file public function save(){ if(!$fp=fopen($this->filePath,'w')){ throw new Exception('Error opening target file.'); } if(!fwrite($fp,$this->data)){ throw new Exception('Error writing data to target file.'); } fclose($fp); } // get target file via an accessor private function getFilePath(){ return $this->filePath; } // get data via an accessor private function getData(){ return $this->data; } } // extends 'DataSaver' class class DataHandler extends DataSaver{ // fetch data from target file public function fetch(){ if(!$data=file_get_contents($this->filePath)){ throw new Exception('Error reading data from target file.'); } return $data; } } try{ // create new instance of 'DataHandler' class $dataHandler=new DataHandler('This string of data will be saved to a target file!','datafile.txt'); // save data to target file $dataHandler->save(); // call private method echo $dataHandler->getFilePath(); /* displays the following Fatal error: Call to private method DataSaver::getFilePath() from context '' in path/to/file/ */ } catch(Exception $e){ echo $e->getMessage(); exit(); } As you can see, I first derived a basic subclass from the “DataSaver” parent, then created a new instance of it, and finally called its “getFilePath()” method in the global scope. This demonstrates in a nutshell that a private method defined by a base class can’t also be invoked by any of its child classes. Not too difficult to understand, right? So far, so good. Having explained how the prior hands-on example functions, it’s time to end this discussion of private class methods with PHP 5. But wait a minute! Before I finish, I’d like to point out that PHP 5 provides developers with yet another mechanism for preventing the methods of a base class from being overridden by one or more subclasses. As you might have guessed, I’m talking about the “final” keyword, whose appropriate utilization will be the final subject of this article. Thus, if you’re interested in learning how to use it within your own classes, jump ahead and read the following section. It’s only one click away.
blog comments powered by Disqus |
|
|
|
|
|
|
|