PHPにはC#のようなプロパティの概念がないので、クラスの特定の属性を公開するための最良の方法は何ですか?get関数とset関数を別々にすることをお勧めしますか、それともメンバー変数を公開する必要がありますか?オブジェクトが別のクラスに含まれるクラスを設計しています。オブジェクトのプロパティを設定/取得する方法があるはずです。
4 に答える
より複雑なアクションを実行する必要がある場合を除いて、全体として、PHPクラスでパブリック変数を公開することをお勧めします。その場合は、getter関数とsetter関数を使用します。
したがって、C#でこれを使用する場所
public string MyProp { get; set; }
PHPでこれをお勧めします
public $MyProp;
getter/setter で public 属性または private を使用すると、両方ともうまくいきます。
私はこのように進みます:
属性が criticalの場合は、次のように 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 を使用した private 属性を優先します。これにより、属性が常にあるべきものであることを確認できます (たとえば、"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
[]