7

概要

コードサンプル:

Class People {
    // private property.
    private $name;

    // other methods not shown for simplicity.
}

まっすぐ進む。$nameそれがPRIVATEクラスのメンバー(またはプロパティ、変数、フィールド、必要に応じて呼び出す)であると仮定します。PHPでこれらを行う方法はありますか?

$someone = new People();
$someone->name = $value;
$somevar = $someone->name;

およびを使用__get($name)せずに__set($name, $value)


バックグラウンド

割り当てられたものを確認する必要があった$valueため、次のようなゲッターセッターが必要です。

getName();
setName($value);

そして、必ずしもこのようにオーバーロードするゲッターセッターマジックメソッドではありません:

__get($value); 
__set($value, $name);

そうは言っても、私は単にゲッターセッターが必要です。しかし、それは私が望んでいることではありません。C ++やC#などの静的型付け言語の人々は、私と同じように感じるかもしれないので、オブジェクト指向のようには感じられません。

getter setterのマジックメソッドのオーバーロードを使用せずに、C#のようにPHPでプライベートプロパティを取得および設定する方法はありますか?


アップデート

なぜ魔法の方法ではないのですか?

  1. マジックメソッドは明示的なゲッターセッターメソッドよりも10倍遅いという噂がウェブ上に浮かんでいます。私はまだテストしていませんが、覚えておくとよいでしょう。(それほど遅くはなく、2倍遅いことがわかりました。以下のベンチマーク結果を参照してください)

  2. 明示的なゲッターセッターのようにプロパティごとに異なる関数に分割するのではなく、マジックメソッドを使用する場合は、すべてを1つの巨大なメソッドに詰め込む必要があります。(この要件はircmaxellによって回答された可能性があります)

パフォーマンスオーバーヘッドベンチマーク

マジックメソッドと明示的なゲッターセッターを使用する間のパフォーマンスのオーバーヘッドに興味があるので、両方のメソッドに対して独自のベンチマークを作成しました。これを読んだ人に役立つことを願っています。

魔法のメソッドとmethod_existを使用する場合:

(コードを表示するには、ここをクリックしてください)

  • ゲッターのコストは0.0004730224609375秒です。
  • セッターのコストは0.00014305114746094秒です。

明示的なゲッターセッターを使用する場合:

(コードを表示するには、ここをクリックしてください)

  • ゲッターのコストは0.00020718574523926秒です。
  • セッターの費用は7.9870223999023E-5秒(0.00007xxx)です。

とは言うものの、魔法のメソッドとメソッドを備えたセッターとゲッターの両方が、明示的なゲッターセッターの2倍のコストで済みます。中小規模のシステムでも問題ないと思います。

4

4 に答える 4

7

いいえ。

しかし、それぞれandの動的プロキシとして機能する__getandを使用することの何が問題なのですか? 何かのようなもの:__setgetName()setName($val)

public function __get($name) { 
    if (method_exists($this, 'get'.$name)) { 
        $method = 'get' . $name; 
        return $this->$method(); 
    } else { 
        throw new OutOfBoundsException('Member is not gettable');
    }
}

そうすれば、すべてを1つのモンスターメソッドに詰め込むことはできませんが$foo->bar = 'baz';、プライベート/保護されたメンバー変数で構文を使用できます...

于 2011-02-07T19:18:55.373 に答える
2

他のポスターですでに指摘されているように、魔法のプロパティを使用することが正しくないように思われる場合は、ReflectionClass::getPropertyReflectionProperty::setAccessibleを検討することもできます。

または、必要な getter および setter メソッドをクラス自体に実装します。

あなたが提起した言語機能の問題に応えて、動的に型付けされた言語を持つことは、静的に型付けされた言語とは異なることが期待されていると言えます。オブジェクト指向言語:比較.

于 2011-02-07T19:10:57.837 に答える
0
class conf_server
{

private $m_servidor="localhost";
private $m_usuario = "luis";
private $m_contrasena = "luis";
private $m_basededatos = "database";

public function getServer(){
    return $this->m_servidor;
}
public function setServer($server){
    $this->m_servidor=$server;
}
public function getUsuario(){
    return $this->m_usuario;
}
public function setUsuario($user){
    $this->m_usuario=$user;
}
public function getContrasena(){
    return $this->m_contrasena;
}
public function setContrasena($password){
    $this->m_contrasena=$password;
}
public function getBaseDatos(){
    return $this->m_basededatos;
}
public function setBaseDatos($database){
    $this->m_basededatos->$database;
}
}
于 2014-02-04T01:35:08.610 に答える