我见过一些在类有get和set方法来操纵插入数据的一些项目。 让我这里有一个例子:
class Student extends dbClass
{
private $TableID;
private $FullName;
private $Gender;
private $Address;
function setTableID($Value)
{
$this->TableID = $Value;
}
function getTableID()
{
return $this->TableID;
}
function setFullName($Value)
{
$this->FullName = $Value;
}
function getFullName()
{
return $this->FullName;
}
function setGender($Value)
{
$this->Gender = $Value;
}
function getGender()
{
return $this->Gender;
}
function setAddress($Value)
{
$this->Address = $Value;
}
function getAddress()
{
return $this->Address;
}
function UpdateStudent()
{
$sql = "UPDATE INTO usertable SET
FullName = '".$this->getFullName()."',
Gender = '".$this->getGender()."',
Address = '".$this->getAddress()."'
where TableID='".$this->getTableID()."'";
$this->query($sql);
}
}
以上是我所见过的例子类。 以下是该过程中,他们是如何使用它:
$student = new Student;
$student->setTableID = 1;
$student->setFullName('My Name');
$student->setGender('Male');
$student->setAddress('this is my address');
$studen->UpdateStudent();
是否值得这样做呢? 我个人认为它没用设置域,然后在它那里得到和更新记录。 这真的需要花费大量的时间把它的每一个模块。 什么是处理此类事情的最好方法? 有没有这样做,任何有关的安全性?
是否值得这样做呢?
这取决于。
通过暴露“智能”属性(即,吸气剂和/或setter)提取来自用户的字段有两个缺点:
- 你需要写更多的代码; 如果该属性并没有真正做任何事情聪明,这是代码,没有任何用处。
- 因为他们必须键入多一点为好属性的用户稍有不便。
它有一个好处:
- 在未来,你可以添加逻辑来的属性,即使有不破坏用户的代码之前没有。
如果这样的好处是有意义的(例如,你正在编写一个可重用的软件库),那么它使伟大的意义写属性,而不是裸露的领域。 如果没有,你这样做是为了毫无益处的工作。
什么是处理此类事情的最好方法?
您可以覆盖魔术__get
和__set
函数(也许在一个基类,所以你可以继承倍率为好)自动转发属性访问到你的getter和setter。 简化的代码:
public function __get($name) {
$getter = 'get'.$name;
if (method_exists($this, $getter)) {
return $this->$getter();
}
$message = sprintf('Class "%1$s" does not have a property named "%2$s" or a method named "%3$s".', get_class($this), $name, $getter);
throw new \OutOfRangeException($message);
}
public function __set($name, $value) {
$setter = 'set'.$name;
if (method_exists($this, $setter)) {
return $this->$setter($value);
}
$getter = 'get'.$name;
if (method_exists($this, $getter)) {
$message = sprintf('Implicit property "%2$s" of class "%1$s" cannot be set because it is read-only.', get_class($this), $name);
}
else {
$message = sprintf('Class "%1$s" does not have a property named "%2$s" or a method named "%3$s".', get_class($this), $name, $setter);
}
throw new \OutOfRangeException($message);
}
买者自负:由于__get
和__set
被覆盖, __isset
和__unset
应该重写以及!
有没有这样做,任何有关的安全性?
不,根本就没有(假设你不插入错误意外)。
在语言不具有的属性 (public成员“变量”,这实际上导致函数调用)使用getter / setter方法,而不是公共变量通常建议。 不然以后如果已经有人在使用您的平坦区域,你不能(设置一个变量时如)添加逻辑。
由于PHP是这样一种语言(不幸)的答案是肯定的,使用它们 。
制作getter和setter方法有助于强制OOP封装。 林不知道的PHP,但对许多其他语言(Java,C ++),良好的IDE(日食/的NetBeans),将自动生成这些getter和setter方法为您服务。
它可能不是简单类型立竿见影,但如果任何一种更复杂的处理必须执行,那么它变得更明显。
我有一些代码,设置在200个不同的文件中值:至于为什么要有时使用getter和setter方法的一个例子:
$cat->name = 'Fery' // in file one
$favoriteCat->name = 'Tery' // in another file
$fatCat->name = 'jery' // in another file
// 200 more calls in alot of places
试想一下,客户突然又有了新的要求:“所有的猫名称必须用‘甜’来前缀
现在,我们必须找到猫的所有声明和替换他们的任务:
$cat->name = 'Sweet '.'Fery'
// times 200
在另一方面,如果我们使用了setter方法我们需要做的就是添加的代码中添加“甜”在一个地方:
public function setCatname($catname)
{
$this->catName = 'Sweet ' . $catname;
}