1

由于 PHP 没有像 C# 这样的属性概念,因此公开类的某些属性的最佳方法是什么?是否建议使用单独的 get 和 set 函数,或者是否应该公开成员变量?我正在设计一个类,其对象将包含在另一个类中。应该有一种方法来设置/获取对象的属性。

4

4 回答 4

2

总的来说,我建议在您的 PHP 类上公开公共变量,除非您需要执行更复杂的操作,在这种情况下您将使用 getter 和 setter 函数。

所以你会在 C# 中使用它的地方

public string MyProp { get; set; }

我会在 PHP 中推荐这个

public $MyProp;
于 2012-11-08T10:15:43.593 回答
2

将公共属性或私有属性与 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例如)。

于 2012-11-08T10:18:25.443 回答
0

视情况而定,公开对安全性不太敏感的属性并不罕见。但是,如果您确实想将它们保密,则可以创建如下内容:

class withAttributes{
   private $property;

   public function getPrivateProperty{
      return $this->property;
    }
}

在另一个班级:

$object = new withAttributes();
$attribute = $object->getPrivateProperty();

希望这可以帮助

于 2012-11-08T10:20:33.290 回答
0

该语言没有内置的惯用方式,但是您可以尝试使用魔法__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接口。[]

于 2012-11-08T10:47:26.900 回答