2

我是一个 PHP 菜鸟,当我阅读一些 joomla 模块的 PHP 文件并尝试学习时,我遇到了这个:

class RokSprocket_Item
{
    protected $text;
    public function setText($introtext)
    {
        $this->text = $introtext;
    }
    public function getText()
    {
        return $this->text;
    }
}

我的问题是,既然函数getText()只是返回$this->text而没有其他任何东西,为什么要使用它?在我看来$this->getText()可以完全替换为$this->text.

4

4 回答 4

6
  1. 因为如果您$something = $object->property通过将属性设置为 public 来允许,那么您也允许$object->property = $something. 这将绕过您在$object->setProperty().
  2. 因为在调用“getter”之前,“getter”方法返回的数据可能实际上并不存在,即。它可能是从数据库或其他数据存储中获取的。
  3. 因为“getter”方法返回的数据实际上可能不是由独立属性表示的,它可能包含在数组或另一个对象中。
  4. 你知道我要去哪里吗?

如果没有看到任何理由将您的类属性设置为私有或受保护或创建 getter 和 setter,那就由您来决定。然而,为什么它们是好主意有无数的理由。

编辑:这是我一直在使用的一些代码的一个简单示例:

<?php
Class Registry {

private $vars = array();

public function __set($index, $value) {
    $this->vars[$index] = $value;
}

public function __isset($index) {
    return isset($this->vars[$index]);
}

public function __get($index) {
    if( isset($this->vars[$index]) ) {
        return $this->vars[$index];
    } else {
        throw new Exception("Index $index not set.");
    }
}

}//-- end class Registry --
于 2013-05-03T22:15:48.643 回答
2

这是面向对象编程中称为封装的最佳实践。当您看到 var $text 前面有关键字 protected 时,这意味着您无法直接从对象外部访问它。您必须使用 getter 和 setter 方法。一个优点是,如果您想在每次访问 var 时对其执行一些操作。例如修改时验证。您可以在 setter 方法中添加验证,并确保更改在任何地方都有效,因为无法以任何其他方式访问 var。

于 2013-05-03T22:23:54.540 回答
1

它是面向对象编程的一部分,称为数据封装。您将私有数据包装在类中,并且不允许用户直接访问您的变量。你只给他们你通过公共方法返回给他们的值

例子:

class Foo {
    public $amount;

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

    public function execute() {
         //do some code using amount that is set in constructor
    }
}

$obj = new Foo(5);
$obj->amount = 99999;
$obj->execute();

基本上,您使用户能够直接修改将由执行函数使用的变量。因此,您设置了不允许用户直接修改变量的 getter 和 setter 方法。

于 2013-05-03T22:12:13.740 回答
1

类的$text属性受到保护。这意味着在客户端代码中(在类之外)您无法访问该值,否则您将收到错误消息。

你需要做的是调用它的publicly accessible方法getText()来返回它的值。

于 2013-05-03T22:12:55.710 回答