由于 PHP 没有像 C# 这样的属性概念,因此公开类的某些属性的最佳方法是什么?是否建议使用单独的 get 和 set 函数,或者是否应该公开成员变量?我正在设计一个类,其对象将包含在另一个类中。应该有一种方法来设置/获取对象的属性。
4 回答
总的来说,我建议在您的 PHP 类上公开公共变量,除非您需要执行更复杂的操作,在这种情况下您将使用 getter 和 setter 函数。
所以你会在 C# 中使用它的地方
public string MyProp { get; set; }
我会在 PHP 中推荐这个
public $MyProp;
将公共属性或私有属性与 getter/setter 一起使用都可以解决问题。
我会这样进行:
如果属性很关键,请使用如下 getter 和 setter:
class myClass
{
private $myAttr;
public function getmyAttr()
{
return $this->myAttr;
}
public function setmyAttr($attr)
{
//Do some verification on $attr
$this->myAttr = $attr;
}
}
如果属性不太重要,您可以简单地设置为 public 的可见性。
由于 php 中缺少强类型,我总是更喜欢带有 getter 和 setter 的私有属性。它让您确保属性始终是它应该是的(而"1"
不是代替1
例如)。
视情况而定,公开对安全性不太敏感的属性并不罕见。但是,如果您确实想将它们保密,则可以创建如下内容:
class withAttributes{
private $property;
public function getPrivateProperty{
return $this->property;
}
}
在另一个班级:
$object = new withAttributes();
$attribute = $object->getPrivateProperty();
希望这可以帮助
该语言没有内置的惯用方式,但是您可以尝试使用魔法__get
和__set
方法来模拟类似的东西。考虑这个非常愚蠢的例子:
Class Foo {
private $bar;
private $baz;
public function __get($name) {
if (property_exists($this, $name)) {
if ($name == 'bar') {
return strtoupper($this->{$name});
} else {
return $this->{$name};
}
}
return null; // this is what php would do, consider throwning an exception instead
}
public function __set($name, $value) {
if (property_exists($this, $name)) {
if ($name == 'bar') {
$this->{$name} = strtolower($value);
} else {
$this->{$name} = $value;
}
}
// we just ignore this call, consider throwing exceptions, or you could make the class open to property addition in runtime too
}
}
$f = new Foo;
$f->bar = 'tickle me elmo';
print $f->bar; // prints uppercase
这样以后,如果您决定实现一些读/写逻辑,您可以将其挂接到魔术方法中。从性能的角度来看,这些神奇的方法比普通的方法调用慢,对于这些类的用户来说,也可以说比显式的 getter/setter 方法更令人惊讶。
如果您想创建更像内置StdObject
或基本的东西,请array
考虑实现语法ArrayAccess
接口。[]