无法访问私有财产

时间:2019-01-30 19:55:44

标签: php

以下代码有问题,我正在尝试打印学生的数据,但出现以下错误:

  

致命错误:未捕获错误:无法访问私有财产   秘书:: $学生

如果我将属性设置为公共属性,它将正常工作。

class Student {

    private $name;

    public function __construct($name){
        $this->name = $name;
    }

    public function getName(){
        return $this->name;
    }

}

class Secretary{

    private $students = array();

     public function printStudents(){

         foreach($this->students as $key=>$value){
             echo $value->name . " ";
         }
     }

}

$secretary = new Secretary();

// Add students.
$student = new student("Student1");
array_push($secretary->students,$student);

$secretary->printStudents();

3 个答案:

答案 0 :(得分:1)

Student-> name是私有数据成员。根据定义,这意味着您不能在Student定义之外访问它。这基本上是getName()的目的,因此您可以在定义之外访问它。

您要执行的操作是:

foreach($this->students as $key=>$value){
    echo $value->getName() . " ";
}

这将按预期进行。

如果您想进一步了解访问修饰符,可以here对其进行阅读。

答案 1 :(得分:1)

为此您需要一个setter函数。您不能直接访问私有变量。

在班级秘书中,您需要一个函数AddStudent(Student $ students);

此功能如下:

public function AddStudent(Student $student) {
    if (!$this->students->contains($student)) {
        $this->students[] = $student;
    }
    return $this;
}

然后,您可以使用函数'printStudents'打印所有学生。

答案 2 :(得分:0)

您不能访问超出其范围的类的私有属性。要实现所需的功能,请考虑采用如下新方法:

public function addStudent(Student $s): Secretary
{
    array_push($this->students, $s);
    return $this;
}

然后,您可以将新学生添加到秘书中。

$s = new Secretary();
$s->addStudent(new Student('Foo'));

$s->printStudents();

您可以看到其中live demo正常工作。