我是一个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
。
答案 0 :(得分:6)
$something = $object->property
,那么您也允许$object->property = $something
。这将绕过您在$object->setProperty()
期间运行的任何类型的验证[或其他]。如果您没有看到任何理由将您的类属性设置为私有或受保护或创建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()
来返回其值。