More on Private Methods with PHP 5 Member Visibility - Calling a private method from a subclass (
Page 3 of 4 )
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.