PHP OOP 私有保护
Posted
技术标签:
【中文标题】PHP OOP 私有保护【英文标题】:PHP OOP private protected 【发布时间】:2016-07-19 15:11:09 【问题描述】:我有以下代码: 类定义:
<?php
class Person
var $name;
public $height;
protected $socialInsurance = "yes";
private $pinnNumber = 12345;
public function __construct($personsName)
$this->name = $personsName;
public function setName($newName)
$this->name = $newName;
public function getName()
return $this->name;
public function sayIt()
return $this->pinnNumber;
class Employee extends Person
还有实例部分:
<!DOCTYPE html>
<HTML>
<HEAD>
<META charset="UTF-8" />
<TITLE>Public, private and protected variables</TITLE>
</HEAD>
<BODY>
<?php
require_once("classes/person.php");
$Stefan = new Person("Stefan Mischook");
echo("Stefan's full name: " . $Stefan->getName() . ".<BR />");
echo("Tell me private stuff: " . $Stefan->sayIt() . "<BR />");
$Jake = new Employee("Jake Hull");
echo("Jake's full name: " . $Jake->getName() . ".<BR />");
echo("Tell me private stuff: " . $Jake->sayIt() . "<BR />");
?>
</BODY>
</HTML>
输出:
Stefan's full name: Stefan Mischook.
Tell me private stuff: 12345
Jake's full name: Jake Hull.
Tell me private stuff: 12345 // Here I was expecting an error
据我所知,私有变量只能从它自己的类中访问,而受保护的变量也可以从扩展类的类中访问。我有私有变量$pinnNumber
。所以我预计,如果我打电话给$Jake->sayIt()
,我会收到错误消息。因为$Jake
是扩展class Person
的class Employee
的成员。并且变量$pinnNumber
应该只能从class Person
访问,而不是从class Employee
。
问题出在哪里?
【问题讨论】:
您是否在班级员工中访问$pinnNumber
?您正在访问sayIt()
,它是公开的,因此可以调用。
Employee
继承自 Person
。 Employee
没有直接访问private
变量。它使用来自父类的方法(它是继承的),并且允许父类访问该变量。因此,一切都很好。
@Daan 是的,因为 $Jack 是 Employee 的成员,所以它需要 Person 的所有属性。所有函数、变量,但如果 $pinnNumber 是私有的,那么如何在输出中显示。
@MichalVlasák 不,你不是。因为您正在调用公共函数。在他自己的类中调用私有属性。
如果你想有目的地防止这种情况发生,那么你必须用子类中实现的方法覆盖父方法。如果该方法试图访问父母的私有财产,那么你确实会得到一个错误。或者,很明显,您可以将 parents 方法声明为私有或受保护。
【参考方案1】:
实际上,它不是这样工作的。
由于您没有扩展 sayIt()
方法,因此不存在“可访问性问题”,如果您执行以下操作将会有一个问题:
<?php
class Person
var $name;
public $height;
protected $socialInsurance = "yes";
private $pinnNumber = 12345;
public function __construct($personsName)
$this->name = $personsName;
public function setName($newName)
$this->name = $newName;
public function getName()
return $this->name;
public function sayIt()
return $this->pinnNumber;
class Employee extends Person
public function sayIt()
return $this->pinnNumber;//not accessible from child class
【讨论】:
【参考方案2】:在您的情况下,受保护的、公共的和私有的只是类的环境范围。由于您的satIt()
函数是public
,因此您可以访问该函数,该函数具有正确的环境范围来访问任何private
或protected
变量。
如果你尝试这样做:
$Jake->pinnNumber
在课堂之外,你会得到错误。
你应该更多地研究方法和类中的作用域,然后你可以转向匿名函数;)
【讨论】:
尝试在Employee
中使用this->pinnNumber
扩展sayIt
并得到一个错误。
下面已经说过了,所以我只是在答案中添加了更多内容..所以解释投票否决
sayIt
函数可以访问pinnNumber
只是因为它没有在子类中扩展,而不是因为它是公共的并且可以访问所有变量。
声明显而易见的.. $Jake
只是继承的人。所以,因为你所说的已经已经说了,我只是注意到你不能在 Classes 范围之外访问 protected
或 private
变量。 慢慢鼓掌
注意到 OP 不能在课堂外使用私有财产并不是 OP 所要求的,所以你的回答只是一个注释。以上是关于PHP OOP 私有保护的主要内容,如果未能解决你的问题,请参考以下文章