【发布时间】: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 方法声明为私有或受保护。
标签: php oop variables private protected