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-&gt;sayIt(),我会收到错误消息。因为$Jake 是扩展class Personclass Employee 的成员。并且变量$pinnNumber 应该只能从class Person 访问,而不是从class Employee

问题出在哪里?

【问题讨论】:

您是否在班级员工中访问$pinnNumber?您正在访问sayIt(),它是公开的,因此可以调用。 Employee 继承自 PersonEmployee 没有直接访问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,因此您可以访问该函数,该函数具有正确的环境范围来访问任何privateprotected 变量。

如果你尝试这样做:

$Jake->pinnNumber

在课堂之外,你会得到错误。

你应该更多地研究方法和类中的作用域,然后你可以转向匿名函数;)

【讨论】:

尝试在Employee 中使用this-&gt;pinnNumber 扩展sayIt 并得到一个错误。 下面已经说过了,所以我只是在答案中添加了更多内容..所以解释投票否决 sayIt 函数可以访问pinnNumber 只是因为它没有在子类中扩展,而不是因为它是公共的并且可以访问所有变量。 声明显而易见的.. $Jake 只是继承的人。所以,因为你所说的已经已经说了,我只是注意到你不能在 Classes 范围之外访问 protectedprivate 变量。 慢慢鼓掌 注意到 OP 不能在课堂外使用私有财产并不是 OP 所要求的,所以你的回答只是一个注释。

以上是关于PHP OOP 私有保护的主要内容,如果未能解决你的问题,请参考以下文章

PHP面向对象OOP编程

面向对象

PHP OOP的特性-封装

php 安全保护与私有

PHP OOP 面向对象的特性

PHP受保护的类和私有类什么区别