0

这可能看起来很简单,我相信它是,我只是不明白。

我了解 PHP 中类中的受保护属性只能在类本身和继承的类中访问。到目前为止,这是我的代码:

class q {

    public $publicQ = "This is a public property";
    protected $protectedQ = "This is a proected property";

    public function displayProtected() {

        echo $this->protectedQ;

    }

}

$q = new q;
echo $q->publicQ; #prints "This is a public property"
echo $q->protectedQ; #nothing
$q->displayProtected();

我已经阅读了文档,查看了关于 SO 的其他答案,但这个概念并没有引起我的注意。受保护的属性实际上做了什么,我们为什么要使用它们,为什么我的示例不起作用?

4

5 回答 5

3

将您的公共属性和方法视为您向外部世界公开的 API,将私有/受保护的 API 视为您的类的“内部工作”,外部世界不仅不应该关注而且不应该搞乱任何一个。

这是强制性的坏车类比:

您在Car类中公开的方法可以是driveForward()and driveBackwards()。他们都将使用一个名为的方法,transmitTheDriveToTheWheels()但它不应该涉及汽车的用户,也不应该被他们访问,所以你可以通过将其设为私有来“隐藏”它。

您的汽车将拥有engine财产。您绝对不希望有人能够通过使用可爱的小猫来替换引擎,$car->engine = $kitty;因此您也可以将引擎设为私有。

最后,您的汽车将拥有mileage财产。您希望用户能够读取里程但不能修改它。因此,您将其mileage设为私有并公开一个公共getMileage()方法。

现在,是否要使用 private 或 protected 来封装类的“内部”内容,取决于您是否希望类被扩展。

于 2013-03-12T21:32:05.900 回答
2

受保护的字段可以被继承,但不能像echo $q->protectedQ; 私有字段一样既不能显示也不能继承。

于 2013-03-12T20:39:53.993 回答
0

受保护的函数使您的类更加灵活。

想想某个地方必须加载一些数据的类。它有一个默认实现,从文件中读取数据。如果你想使用同一个类,但想改变它获取数据的方式,你可以创建一个子类并覆盖 getData() 函数。

于 2013-03-12T20:39:45.163 回答
0

正如您所发现的,与公共方法的唯一真正区别是,受保护的函数只能从类内部或继承树中的另一个类中访问。

当函数不打算从类外部使用时,您不希望将函数声明为受保护的。这是一个语言功能,纯粹是为了让您的代码更易于理解(更易于阅读)并且不易受到错误和误用的影响。没有任何事情(以功能形式)是您仅使用公共方法无法完成的。

如果您与他人共享您的代码或者它是某种库,这将非常有用。

对于 PHP,在使用 PHP 的魔法 getter 和 setter 函数 ( http://www.php.net/manual/en/language.oop5.overloading.php#object.set )时有一个特别有用的案例。

public $a = '1';
protected $b = '2';

public function __get($name) {
    return $this->{$name}.' (protected)';
}

$obj->a; //1
$obj->b; //2 (protected)

例如,您可以“保护”您的变量并使用魔术函数捕获调用。如果您发布了一个带有变量的类,然后您决定在返回变量之前在类内部进行一些预处理,这将很有用。

于 2013-03-12T20:41:28.267 回答
0

您使用受保护/私有方法来包含功能,以使您的代码更易于阅读并防止在公共方法中重复相同的功能。

使属性受保护可以保护对象不被外部修改,除非您通过设置器提供访问权限。

您可以更好地控制对象的使用方式。

于 2013-03-12T20:44:11.463 回答