Home  >  Article  >  Backend Development  >  Analysis of private attribute inheritance issues in PHP classes

Analysis of private attribute inheritance issues in PHP classes

高洛峰
高洛峰Original
2016-12-01 11:46:171028browse

Please read this sentence carefully if the parent class has private attributes. Then the method of the parent class only serves the private properties of the parent class.
The following is a series of examples to deepen understanding.
This example seems strange. An attribute $sal is redefined in the subclass, but the system returns the attributes of the parent class.
Copy code The code is as follows:
class employee{
private $sal=3000;
//protected $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $sal=5000;

public function getParentSal(){
//What is returned here is the private attribute of the parent class.
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."
";
echo $manager->getSal();
echo "
";
echo "parent's $sal " .$manager->getParentSal();
?>

Program running results:
Copy code The code is as follows:
PHP 5.3.8
3000
parent's $sal 3000

If the attributes in the parent class are overridden by the subclass . The result is this. Note that the attribute definition in line 5 becomes protected.
Copy code The code is as follows:
class employee{
//private $sal=3000;
protected $sal=3000;
public function getSal(){
return $this->sal;
}
}

class Manager extends employee {
protected $sal=5000;

public function getParentSal(){
//What is returned here is the private attribute of the parent class.
return parent::getSal();
}
}
$ manager = new Manager();
echo "PHP ".phpversion()."
";
echo $manager->getSal();
echo "
";
echo "parent's $sal ".$manager->getParentSal();

?>

Program running results:
Copy code The code is as follows:
PHP 5.3.8
5000
parent's $sal 5000

The parent class in the first column private $sal has not been overridden, so the parent class method $manager->getSal() calls the parent class’s own private property $sal. At this time, there are two $sal in the memory
The parent class’s in the second column protected $sal is overridden $manager->getSal() The method of this parent class calls the overridden $sal. The $sal of the parent class does not exist in the memory. At this time, there is only one $sal in the memory
Next Look at the third example
The overridden method in the subclass is valid for the current private.
Copy code The code is as follows:
class employee{
private $sal=3000;
public function getSal(){
return $this->sal;
}
}

class Manager extends employee {
private $sal=5000;
//Rewritten method
public function getSal(){
return $this->sal;
}
public function getParentSal(){
//What is returned here is the private attribute of the parent class .
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."
";
echo $manager->getSal() ;
echo "
";
echo "parent's $sal ".$manager->getParentSal();
?>

Run results
Copy code The code is as follows:
PHP 5.3.8
5000
parent's $sal 3000

In this example, the subclass overrides the getSal() method so it calls the properties of the subclass
If you comment this line of the subclass
//private $sal=5000;
You will find an error: Notice: Undefined property: Manager::$sal in E:wampwwwoo2-52-5-3.php on line 14
If you comment out the subclass rewrite method on line 12, then echo $manager->getSal(); will be obtained The result is the private attribute $sal 3000 of the parent class.

Open the zend debugging state to see what is going on in the memory. Note that there are two $sal at the bottom. They are 3000 and 5000 respectively.
Copy code The code is as follows:
class employee{
private $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $ sal=5000;
public function getParentSal(){
return $this->sal;
}
}
$manager = new Manager();
echo "PHP ".phpversion()."
";
echo $manager->getSal();
?>

Program running results:
Copy the code The code is as follows:
PHP 5.3.8
3000

Change the parent class’s attribute $sal to protected , and the subclass overrides the parent class’s attributes. There is only one $sal in memory.
Copy code The code is as follows:
class employee{
protected $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $ sal=5000;
public function getParentSal(){
return $this->sal;
}
}
$manager = new Manager();
echo "PHP ".phpversion()."
";
echo $manager->getSal();

?>

Program running results:
Copy code The code is as follows:
PHP 5.3.8
5000

If you have learned java, you will think that all this is It's hard to understand.
In Java, when a subclass is created, the properties and methods of the parent class are created in memory, and even the constructor is called.
This is not the case with PHP5. PHP5 uses parent:: instead of parent-> when calling the parent class. This is enough to show that PHP5 does not want the parent class to be created in memory. PHP5 wants to make inheritance simpler than Java.
Just get used to it.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn