为什么使用$ item-> getText()而不是$ item-> text?

时间:2013-05-03 22:09:52

标签: php joomla

我是一个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 个答案:

答案 0 :(得分:6)

  1. 因为如果您通过将该属性设置为公开来允许$something = $object->property,那么您也允许$object->property = $something。这将绕过您在$object->setProperty()期间运行的任何类型的验证[或其他]。
  2. 因为'getter'方法返回的数据在调用'getter'之前可能实际上不存在,即。它可能是从数据库或其他数据存储中获取的。
  3. 由于'getter'方法返回的数据实际上可能不是由独立属性表示,因此它可能包含在数组或其他对象中。
  4. 你知道我要去哪儿吗?
  5. 如果没有看到任何理由将您的类属性设置为私有或受保护或创建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 --
    

答案 1 :(得分:2)

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

答案 2 :(得分: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();

基本上,您正在为用户提供修改将由execute函数使用的变量的直接功能。因此,您设置了不允许用户直接修改变量的getter和setter方法。

答案 3 :(得分:1)

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

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